Function R中“substitute”的迷惑行为
伙计们,这让我发疯 这与预期的效果一样:Function R中“substitute”的迷惑行为,function,r,eval,substitution,quote,Function,R,Eval,Substitution,Quote,伙计们,这让我发疯 这与预期的效果一样: eobj <- substitute(obj <- list(a, b), list(a = 32, b = 33)) eval(eobj) obj [[1]] [1] 32 [[2]] [1] 33 eobj原因当您打印fun时,它实际上是函数的打印源(请参见属性(fun)),而不是由替换修改 请注意,在全局工作区中定义a或b时,函数结果是相同的 您可以通过body(fun)查看函数的实际代码 或比较: print.function(f
eobj <- substitute(obj <- list(a, b), list(a = 32, b = 33))
eval(eobj)
obj
[[1]]
[1] 32
[[2]]
[1] 33
eobj原因当您打印fun
时,它实际上是函数的打印源(请参见属性(fun)
),而不是由替换修改
请注意,在全局工作区中定义a
或b
时,函数结果是相同的
您可以通过body(fun)
查看函数的实际代码
或比较:
print.function(fun, useSource=FALSE)
# function ()
# 32 + 33
print.function(fun, useSource=TRUE) # Which is default
# function() a+ b
是的,它确实是源头。但是,我还是很困惑,来源是什么?乐趣的来源与对象本身是分开的吗?表达式efun
没有对源的任何引用eval
无法直接访问原始定义。我认为源代码是在substitute
工作之前设置的。也就是说,function
使用参数源创建表达式类型(语言?)的对象,然后用未触及源的正确值替换表达式中a
和b
的值
显示它为您的函数保留的源代码以及实际打印的内容。如果没有“source”
属性,则打印将显示实际功能。因此,attr(fun,“source”)@Marek看起来是这样的。但这意味着在解析时,在将函数分配给fun
之前设置源代码。同时,它存储在哪里efun
没有源属性。这可能是我们最好问一下R核心。@VitoshKa它就在那里的某个地方,如果你保存(efun,file=“test.txt”,ascii=TRUE)
并检查这个文件,那么你就会看到原始代码带有a
和b
。
print.function(fun, useSource=FALSE)
# function ()
# 32 + 33
print.function(fun, useSource=TRUE) # Which is default
# function() a+ b