大家好,这让我很疯狂。
以下内容按预期工作:
eobj <- substitute(obj <- list(a, b), list(a = 32, b = 33))
eval(eobj)
obj
[[1]]
[1] 32
[[2]]
[1] 33
现在,请尝试这个:
efun <- substitute(fun <- function() a+ b, list(a = 32, b = 33))
str(efun)
# language fun <- function() 32 + 33
eval(efun)
fun
# function() a+ b
这里发生了什么?到底是怎样让
eval
获取表达式的原始形式的?
substitute
起作用之前,源代码已经被设置好了。这里的function
会创建一个带有源代码参数的表达式(语言?),然后substitute
将表达式内部的a
和b
的值替换为正确的值,但不会改变源代码。 - Marekattr(fun, "source")
显示函数保留的源代码以及print
实际打印出来的内容。如果没有"source"
属性,则print
将显示实际函数。因此,attr(fun, "source") <- NULL
将导致print
显示实际函数而不是"source"
属性的内容。另外,options(keep.source = FALSE)
可用于完全关闭此行为,在这种情况下,您的函数将首先不会获得"source"
属性。 - G. Grothendieckfun
之前,在解析时设置了源。那么它在此期间存储在哪里?efun
没有源属性。这可能是我们最好问 R 核心。 - VitoshKasave(efun, file="test.txt", ascii=TRUE)
并查看这个文件,你会发现其中包含了带有a
和b
的原始代码。 - Marek