2010-04-06 76 views
4

有什麼辦法,給一個函數作爲參數傳遞,在評估它之前改變它的輸入參數字符串?在R中評估函數之前將函數改爲參數?

這裏是僞代碼什麼我希望能實現:

test.func <- function(a, b) { 
    # here I want to alter the b expression before evaluating it: 
    b(..., val1=a) 
} 

鑑於函數調用傳遞給b,我想在a添加爲另一個參數,而無需在b始終指定...呼叫。所以從這個test.func調用的輸出應該是:

test.func(a="a", b=paste(1, 2)) 
"1" "2" "a" 

編輯

另一種方式,我可以看到做這樣的事情是,如果我可以在父功能的範圍內分配額外的參數(再次,作爲僞代碼);在這種情況下a將T1和T2,因此的範圍之內,但不是全局分配:

t2 <- function(...) { 
    paste(a=a, ...) 
} 

t1 <- function(a, b) { 
    local({ a <<- a; b }) 
} 

t1(a="a", b=t2(1, 2)) 

這有點類似於柯里在我嵌套函數內部的參數。

編輯2

只是爲了多一個註釋添加到這一點:我認識到,一個相關的辦法可能是使用「prototype-based programming」這樣的事情會被繼承(這可能與the proto package實現)。但我希望在R中評估之前簡單地改變輸入參數。

+0

你能不能給一個現實的問題,你可以修改?重新思考你的方法可能是有條不紊的。 – hadley 2010-04-07 16:15:19

回答

2

您是否檢查substitute?我不知道它滿足你的需求,但你可以用事實返回隱藏list結構如下

test.func <- function(a, b) { 
    f <- substitute(b) 
    f[["val1"]] <- a 
    eval(f) 
} 

test.func(a="a", b=paste(1, 2)) 
# "1 2 a" 
+0

這正是我正在尋找的。謝謝! – Shane 2010-04-06 21:43:09

0

你想對B表達式做什麼?你想動態添加行爲?然後在你的問題中有一個裝飾模式。想要選擇添加行爲?代理。在某些情況下需要替換另一種行爲?戰略。

與使用特定於語言的功能相比,您可以改變策略的行爲,而依賴於設計模式(無論您使用的語言如何工作並使其更加高效)