我想用一個給定的函數名字符串來調用一個函數。如何使用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?
我想用一個給定的函數名字符串來調用一個函數。如何使用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?
那些看起來不像字符串;看起來像一個函數列表。要回答題目中提出的問題,請參閱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
感謝您的答案。但你是對的..我沒有一個字符串列表我有一個函數列表。你能告訴我如何用函數列表來做到這一點嗎? – tObi
@tobi @Joshua在他上面的評論中提到,你做了什麼爲我工作。我已經更新了我的答案,告訴你什麼可行。如果我的答案中的示例不適用於您,請編輯您的問題以向我們顯示當您嘗試此操作時R給出的確切輸出。 –
查看有關do.call
的文檔。
一個快速演示:
do.call("rnorm", list(100, 0, 1))
第一參數可以是一個字符串,或R物體,而第二個是那些與提供的函數的形式參數相匹配的參數列表。
你也可以使用match.fun
> functionlist <- list("*","sin")
> f <- match.fun(functionlist[[1]])
> f(5,6)
[1] 30
你的榜樣工程對於m e和列表中的元素不是字符,它們是函數。 –