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

Posted

技术标签:

【中文标题】如何使用R中函数名的字符串调用函数?【英文标题】:How to call a function using the character string of the function name in R? 【发布时间】:2011-09-18 05:34:13 【问题描述】:

我正在尝试使用给定的函数名称字符串调用函数。

例如

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

[[2]]
sin

作品:

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

不起作用:

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

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

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

【问题讨论】:

您的示例对我有用,您列表中的元素不是字符,而是函数。 【参考方案1】:

那些看起来不像字符串;这看起来像一个函数列表。要回答标题中提出的问题,请参阅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 正如@Joshua 在他上面的评论中提到的那样,你所做的对我有用。我已经更新了我的答案,向您展示什么是有效的。如果我的答案中的示例对您不起作用,请编辑您的问题,向我们展示您尝试此操作时 R 给出的确切输出。【参考方案2】:

请参阅do.call 的文档。

快速演示:

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

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

【讨论】:

【参考方案3】:

你也可以使用match.fun

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

【讨论】:

以上是关于如何使用R中函数名的字符串调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在具有相同函数名的派生类中调用基类的函数[重复]

在Python中使用字符串调用函数

python中如何调用自己写的函数

如何动态调用 C 函数

如何在 R 中使用“hclust”作为函数调用

在 SSMS 中,如何使用在 KEY 字 FROM 后返回表名的函数