R中"替代"的令人困惑的行为

Vit*_*hKa 6 eval r function substitution quote

伙计们,这让我发疯了.

这按预期工作:

eobj <- substitute(obj <- list(a, b), list(a = 32, b = 33))
eval(eobj)
obj
[[1]]
[1] 32

[[2]]
[1] 33
Run Code Online (Sandbox Code Playgroud)

现在,试试这个:

efun <- substitute(fun <- function() a+ b, list(a = 32, b = 33))
str(efun)
# language fun <- function() 32 + 33  
eval(efun)
fun
# function() a+ b
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?究竟是怎么eval把它放在表达的原始形式上?

Mar*_*rek 8

打印fun时的原因实际上是打印的功能源(请参阅参考资料attributes(fun)),该功能未被修改substitute.

请注意,在定义ab在全局工作空间中,函数结果是相同的.

你可以看到实际的功能代码body(fun).

或比较:

print.function(fun, useSource=FALSE)
# function () 
# 32 + 33
print.function(fun, useSource=TRUE) # Which is default
# function() a+ b
Run Code Online (Sandbox Code Playgroud)

  • `attr(fun,"source")`显示了它为你的函数保留的来源以及`print'实际打印出来的内容.如果没有"source"属性,那么`print`将显示实际的功能.因此`attr(fun,"source")< - NULL`将导致`print`显示实际函数而不是``source``属性的内容.另外`options(keep.source = FALSE)`可以用来完全关闭这种行为,在这种情况下你的函数首先不会得到一个``source'`属性. (2认同)