我如何在R
中执行此操作:
我已经找到了一个名为exampleFoo
的函数,假设:
exampleFoo <- function(a, predefined, signature)
给定字符向量exampleFoo
,如何使用它来调用具有该名称的函数?
答案 0 :(得分:4)
这取决于它是在另一个功能内部还是在顶层。我会按相反顺序拍摄。
exampleFoo <- function(a, predefined, signature) {
1:10
}
FUN <- "exampleFoo"
get(FUN)
get(FUN)()
> get(FUN)
function(a, predefined, signature) {
1:10
}
> get(FUN)()
[1] 1 2 3 4 5 6 7 8 9 10
在函数中,match.fun
参数最适用于此处。 get
查找具有提供名称的对象,而match.fun
仅在搜索时考虑函数对象。这样做的另一个好处是不匹配可能具有相同名称的非功能对象。
FOO <- function(f) {
BAR <- match.fun(f)
BAR()
}
> FOO(FUN)
[1] 1 2 3 4 5 6 7 8 9 10
> FOO("exampleFoo")
[1] 1 2 3 4 5 6 7 8 9 10
您无法在顶层使用match.fun
(轻松?),因为它旨在在调用者的父框架中执行匹配,而Global环境没有父级(IIRC)。< / p>
@agstudy建议采用基于switch
的方法来设置包装函数,该函数可以通过名称调用多个预定义函数之一。在那里的评论中,我提出了两个更简单的选择。我在此扩展:
foo1 <- function(method, ...) {
dots <- list(...)
FUN <- match.fun(method)
do.call(FUN, dots)
}
或
foo2 <- function(method = c("fun1", "fun2", "fun3"), ...) {
dots <- list(...)
method <- match.arg(method)
FUN <- match.fun(method)
do.call(FUN, dots)
}
我把它们写成非常通用的函数,它们带有任何参数加上method
。如果通过/传递给method
的函数具有...
参数,则可以直接调用这些函数,可能使用一个或多个命名参数,例如。
## assuming `method` refers to a function with a first argument `x` and also
## a `...` argument
foo3 <- function(method, x, ...) {
FUN <- match.fun(method)
FUN(x, ...)
}
答案 1 :(得分:1)
text<-"exampleFoo"
exampleFoo<-function(x) print("Success")
eval(parse(text=paste(text,"()")))
#[1] "Success"
正如@joran所建议的那样,get()
似乎可以替代eval(parse(text="..."))
get(text)()
#[1] "Success"
答案 2 :(得分:1)
我会使用switch
,例如:
algoFactory <- function (method = c("algo1", "alog2",
"algo3")
{
method = method[1]
switch(method, algo1 = {
res = algo1.Impl(...)
}, algo2 = {
res = algo2.Impl(...)
}, algo3 = {
res = algo3.Impl(...)
})}
每次添加新算法时,我都会更新此主函数。在您的RscripT中,您可以将其称为:
Rscript algoFactory.R 'algo1'