2015-02-04 19 views
6

我試圖使用一個變量來存儲函數名稱作爲字符串來繪製曲線。像下面這樣:將表達式作爲變量傳遞給曲線

f1 <- function(x) 0*x 
f2 <- function(x) 1 + 0*x 
f3 <- function(x) 2 + 0*x 

fn <- "f1" 

plot.new() 
plot.window(xlim = c(0, 1), ylim = c(-1, 3)) 

curve(get(fn), add = TRUE) 
Error in curve(get(fn), add = TRUE) : 
    'expr' must be a function, or a call or an expression containing 'x' 

curve(f1, add = TRUE) 
curve(f2, add = TRUE) 
curve(f3, add = TRUE) 

我知道,我的思念與如何curve處理表達與替代,或如何get被傳遞功能的東西。我特別困惑,因爲class(get(fn))返回「功能」。

回答

8

嗯,問題是curve()不會評估您傳入的參數。它會查看您傳遞給參數的內容,而不是評估參數的結果。當您運行時

curve(fn) 

您傳遞的是「名稱」(或「符號」)。這會觸發函數以該名稱查找函數。當您運行時

curve(get("f1")) #error 

您已通過通話。同樣,該調用不會被曲線執行以查看它返回的函數。如錯誤消息所示,如果您傳入呼叫,則該表達式應該包含x。例如

curve(f1(x)) 

x變量調用語法的一個例子。

如果你真的需要指定函數作爲特徵向量,就可以將一個字符轉換爲名字對象,然後建立呼叫與do.call曲線。例如

do.call("curve",list(as.name(fn))) 

,或者你可以修改您的通話與特殊x變量

curve(get(fn)(x)) 
+0

如果你想添加額外的參數觸發產生功能,比如'加= TRUE',它會看起來像這樣:'do.call(曲線,列表(as.name(fn),add = TRUE))' –

+1

你也可以通過首先強制評價'{get(fn) - > f;曲線女,添加= TRUE)}' –