我正在编写一个使用用户定义的R函数的R包。这些函数需要在Rcpp函数中多次求值。
我看到了两种出路:
1-使用RInline创建几个R会话,在每个R会话中使用不同的参数评估函数,然后收集这些结果?
2-围绕用户定义的R函数编写一个包装器,以便将其矢量化,并并行计算R函数的不同输入。然后将此函数传递给Rcpp,希望在被调用时R函数仍将并行运行。
我不确定这些方法中是否有任何一种可行。尝试第二种方法很容易!但也许有人有更好的解决方案。
发布于 2020-12-06 17:08:20
我想我有第二个选择去工作。无论如何,感谢您的快速响应。我也认为第一种方法是可行的。但这一条足以满足我的目的。如下例所示:
library(Rcpp)
library(future.apply)
userfunc<-function(x){
Sys.sleep(1)
return(x)
}
wrapperufpar<-function(xvec){
plan(multisession)
future_sapply(xvec, userfunc)
}
cppFunction('NumericVector cppfunc(NumericVector xvec, Function ufunc) {
NumericVector out(xvec.length());
for (int i=0;i<xvec.length();i++){
out(i)=as<double>(ufunc(xvec(i)));
}
return out;
}')
cppFunction('NumericVector cppfuncpar(NumericVector xvec, Function ufuncw) {
NumericVector out=as<NumericVector>(ufuncw(xvec));
return out;
}')
cppfunc(1:10, userfunc)
[1] 1 2 3 4 5 6 7 8 9 10
cppfuncpar(1:10, wrapperufpar)
[1] 1 2 3 4 5 6 7 8 9 10
microbenchmark::microbenchmark(wrapperufpar(1:10),
sapply(1:10, userfunc),
cppfunc(1:10, userfunc),
cppfuncpar(1:10, wrapperufpar),
times=10)
单位:秒
expr min lq mean median
wrapperufpar(1:10) 4.372158 4.456099 4.488181 4.477420
sapply(1:10, userfunc) 10.002320 10.003834 10.005113 10.004944
cppfunc(1:10, userfunc) 10.002743 10.004133 10.005217 10.004824
cppfuncpar(1:10, wrapperufpar) 4.434338 4.475258 4.490961 4.491418
uq max neval
4.548762 4.564422 10
10.006996 10.007854 10
10.006614 10.008436 10
4.509277 4.545920 10
https://stackoverflow.com/questions/65160527
复制相似问题