2011-06-19 53 views
26

我想用一個給定的函數名字符串來調用一個函數。如何使用R中函數名稱的字符串調用函數?

例如

print(funcList) 
[[1]] 
`*` 

[[2]] 
sin 

作品:

mult <- `*` 
mult(5,6) 
[1] 30 

不起作用:

func1 <- funcList[[1]] 
func1(5,6) 

func2 <- funcList[[2]] 
func2(1.2) 

那麼,是否可以調用所有的功能在functionList?

+0

你的榜樣工程對於m e和列表中的元素不是字符,它們是函數。 –

回答

31

那些看起來不像字符串;看起來像一個函數列表。要回答題目中提出的問題,請參閱get()。例如,使用您的列表,但作爲字符串存儲:

funcList <- list("*", "sin") 

我們可以使用get()與由列表中選定的元素給定的名稱返回功能:

> f <- get(funcList[[1]]) 
> f 
function (e1, e2) .Primitive("*") 
> f(3,4) 
[1] 12 

另一種是match.fun()函數,它給出一個字符串將找到名稱匹配的字符串的函數:

> f2 <- match.fun(funcList[[1]]) 
> f2(3,4) 
[1] 12 

?match.fun告訴我們,我們可能不應該在提示時這樣做,而應該在一個函數內進行。

如果你有一個函數列表,則可以簡單地索引列表,並使用它作爲一個功能:

> funcList2 <- list(`*`, sin) 
> str(funcList2) 
List of 2 
$ :function (e1, e2) 
$ :function (x) 
> funcList2[[1]](3, 4) 
[1] 12 
> funcList2[[2]](1.2) 
[1] 0.9320391 

,或者你可以從保存的功能爲臨時對象,但有一點在做了這一點:

> f3 <- funcList2[[1]] 
> f3(3,4) 
[1] 12 
> f4 <- funcList2[[2]] 
> f4(1.2) 
[1] 0.9320391 
+0

感謝您的答案。但你是對的..我沒有一個字符串列表我有一個函數列表。你能告訴我如何用函數列表來做到這一點嗎? – tObi

+0

@tobi @Joshua在他上面的評論中提到,你做了什麼爲我工作。我已經更新了我的答案,告訴你什麼可行。如果我的答案中的示例不適用於您,請編輯您的問題以向我們顯示當您嘗試此操作時R給出的確切輸出。 –

21

查看有關do.call的文檔。

一個快速演示:

do.call("rnorm", list(100, 0, 1)) 

第一參數可以是一個字符串,或R物體,而第二個是那些與提供的函數的形式參數相匹配的參數列表。

1

你也可以使用match.fun

> functionlist <- list("*","sin") 
> f <- match.fun(functionlist[[1]]) 
> f(5,6) 
[1] 30 
相關問題