Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function R中“substitute”的迷惑行为_Function_R_Eval_Substitution_Quote - Fatal编程技术网

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