如何使用R中函数名的字符串调用函数?

tOb*_*Obi 37 r

我试图用函数名称的给定字符串调用函数.

例如

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

[[2]]
sin
Run Code Online (Sandbox Code Playgroud)

作品:

mult <- `*`
mult(5,6)
[1] 30
Run Code Online (Sandbox Code Playgroud)

不起作用:

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

func2 <- funcList[[2]]
func2(1.2)
Run Code Online (Sandbox Code Playgroud)

那么可以调用functionList中的所有函数吗?

Rei*_*son 42

那些看起来不像字符串; 看起来像一个功能列表.要回答标题中提出的问题,请参阅get().例如,使用您的列表但存储为字符串:

funcList <- list("*", "sin")
Run Code Online (Sandbox Code Playgroud)

我们可以get()用来返回列表中所选元素给出的名称的函数:

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

另一种方法是match.fun()函数,给定一个字符串将找到一个名称与该字符串匹配的函数:

> f2 <- match.fun(funcList[[1]])
> f2(3,4)
[1] 12
Run Code Online (Sandbox Code Playgroud)

但正如?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
Run Code Online (Sandbox Code Playgroud)

或者您可以将这些功能保存为临时对象,但这样做没有意义:

> f3 <- funcList2[[1]]
> f3(3,4)
[1] 12
> f4 <- funcList2[[2]]
> f4(1.2)
[1] 0.9320391
Run Code Online (Sandbox Code Playgroud)


aL3*_*3xa 30

请参阅文档do.call.

快速演示:

do.call("rnorm", list(100, 0, 1))
Run Code Online (Sandbox Code Playgroud)

第一个参数可以是字符串文字或R对象,第二个参数是要与提​​供的函数形式参数匹配的参数列表.


mcc*_*dar 7

你也可以使用match.fun

> functionlist <- list("*","sin")
> f <- match.fun(functionlist[[1]])
> f(5,6)
[1] 30
Run Code Online (Sandbox Code Playgroud)