R:在传递给lapply时找不到“功能”?

时间:2014-02-19 02:03:19

标签: r

我想实现另一个版本的lapply函数,它允许我指定是否并行运行。代码是这样的:

papply <- function(x,fun,...,
  parallel=FALSE,parallel.options=list(mode="socket",cpus=2),
  integrate=rbind,convert=NULL) {
  if(parallel) {
    require(parallelMap)
    do.call(parallelStart,parallel.options)
    result <- parallelLapply(x,fun,...)
    parallelStop()
  } else {
    result <- lapply(x,fun,...)
  }
  if(is.function(integrate)) {
    result <- do.call(integrate,result)
  }
  if(is.function(convert)) {
    result <- convert(result)
  }
  return(result)
}

如果parallel=TRUE,我在parallelLapply()包中使用{parallelMap},否则我使用普通的lapply函数。在这两种方法中,我尝试映射的向量/列表是x,映射函数是fun。由于fun可能包含多个参数,因此我使用...将其他参数传递给fun

但是,如果没有指定其他参数,例如

papply(1:5,function(i,x){return(data.frame(a=i,b=i+1))})

工作正常并返回正确的值:

  a b
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6

但是如果指定了其他参数,比如

papply(1:5,function(i,x){return(data.frame(a=i,b=i+x))},x=1)

它无效但报告错误如

 Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'fun' of mode 'function' was not found 
4 get(as.character(FUN), mode = "function", envir = envir) 
3 match.fun(FUN) 
2 lapply(x, fun, ... = ...) at utils.R#37
1 papply(1:5, function(i, x) {
    return(data.frame(a = i, b = i + x))
}, x = 1) 

我不知道为什么会出现这种错误。如何解决错误并使功能正常工作?

1 个答案:

答案 0 :(得分:4)

这归结为位置匹配和参数命名问题。

xpapply的正式参数,因此,当您在

中命名时
papply(1:5,function(i,x){return(data.frame(a=i,b=i+x))},x=1)

这意味着1:5匹配为fun - &gt;因此错误。

在您的函数的当前形式中,R无法知道当您表示x=1时 您希望在...组件中考虑这一点。

请参阅MoreArgs的{​​{1}}参数作为可能有用的方法。