我想实现另一个版本的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)
我不知道为什么会出现这种错误。如何解决错误并使功能正常工作?
答案 0 :(得分:4)
这归结为位置匹配和参数命名问题。
x
是papply
的正式参数,因此,当您在
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}}参数作为可能有用的方法。