评估从字符串构造的函数调用

时间:2017-11-16 23:29:48

标签: r

假设我有两个函数,其名称包含在向量中。我想测试每个功能是否有效。

我的方法,我很容易承认可能是错误的,就是遍历向量然后将func1 <- function(){ message("func1 works") } func2 <- function(){ message("func2 works") } fv <- c("func1","func2") for(i in seq_along(fv)){ fv_func <- paste0(fv[i],"()") print(fv_func) } [1] "func1()" [1] "func2()" 粘贴到函数名称。但后来我意识到我不知道如何评估当前存储为字符串的函数调用。这是一个代表:

func1()

所以在这个上下文中我问的是如何评估func2()和{{1}},尽管最终目标是评估名称存储在向量中的函数 - 这意味着我可以更好地解决问题

3 个答案:

答案 0 :(得分:2)

如果您将函数的名称作为字符串,则可以get()

fv <- c("func1","func2")

for(i in seq_along(fv)){
    fv_func <- get(fv[i])
    # Can just call normally, no need to paste () on
    fv_func()
} 

答案 1 :(得分:2)

尝试其中任何一种:

out <- lapply(fv, do.call, list())

out <- lapply(fv, function(f) match.fun(f)())

答案 2 :(得分:1)

如果我们使用vectorised for,我们可以在没有eval(parse)循环的一行中执行此操作:

eval(parse(text = paste0(fv,'()')))