如何通过命令行调用R中的函数?

时间:2013-04-05 14:38:11

标签: r

我如何在R中执行此操作:

我已经找到了一个名为exampleFoo的函数,假设:

exampleFoo <- function(a, predefined, signature)

给定字符向量exampleFoo,如何使用它来调用具有该名称的函数?

3 个答案:

答案 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'