substitute(substitute())是什么意思?

3

我并不完全理解substitute函数的作用,尽管我之前在代码中使用过。今天我在shiny::exprToFunction中遇到了以下代码:

function (expr, env = parent.frame(2), quoted = FALSE, caller_offset = 1) 
{
    expr_sub <- eval(substitute(substitute(expr)), 
...
}

有人能解释一下为什么这里使用了嵌套的substitute吗?提供一个易于运行的示例会非常有帮助。

1个回答

6
请看:

看一下

a<-function(aa) {
    b(aa)
}

b<-function(bb) {
    z(bb)   
}

z<-function(zz) {
    print(substitute(zz))
    print(substitute(substitute(zz)))
    print(eval(substitute(substitute(zz)), parent.frame()))
}

q<-5
a(q)
# bb
# substitute(bb)
# aa

第一个/内部替代品获取传递给调用函数的名称/符号。第二个/外部substitute()只是将substitute()命令包装在发现的名称/符号周围。然后,在它来自的父环境中评估该substitute()

仅当参数仍然是承诺(即尚未评估)时,使用substitute捕获变量名称的方法才有效。


我认为你可能搞反了。外部的替换操作作用于未求值的表达式 substitute(zz),生成表达式 substitute(bb),然后在父框架中进行 eval 操作。虽然效果相同,但操作顺序略有不同。 - gbrunick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接