2015-06-11 272 views
3

我不完全相信我明白substitute是干什么的,尽管我以前在代码中使用过。今天,我在shiny::exprToFunction遇到下面的代码行:什么是替代(替代())?

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

是否有人可以解释为什么嵌套substitute在这里使用?一个易于运行的示例将非常有帮助。

回答

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捕获变量名称的方法仅在参数仍有承诺时才有效;也就是说,他们还没有被评估过。