2015-06-11 269 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捕獲變量名稱的方法僅在參數仍有承諾時纔有效;也就是說,他們還沒有被評估過。