我试图像R一样实现lapply的方法,但是在C ++中使用Rcpp和RcppParallel并行实现。我想将一个函数应用于PARALLEL中List中的每个元素,并且我在函数内部遇到了一些问题' transform'我想传递一个将要应用的函数,但该函数来自R,当我尝试编译程序时出现错误。
但是在连续避免循环中使用它,使用变换并传递一个'功能f'它编译和工作完美,这就是代码:
List lapplyCppSerial(List input, Function f){
std::transform(input.begin(), input.end(), output.begin(), f);
return output;
}
当我尝试以并行方式进行相同操作时,使用parallelFor()我必须创建一个可以"迭代"所有元素。在operator()中我想再次使用transform(),但是我将错误的函数作为参数传递给了之前。
我认为它缺少了但我无法找到它。我希望有人可以帮助我。
以下是代码:
#include <Rcpp.h>
#include <RcppParallel.h>
// [[Rcpp::depends(RcppParallel)]]
using namespace RcppParallel;
using namespace Rcpp;
struct Fun : public Worker
{
// source vector
const RVector<double> input;
Rcpp::Function f;
// output values
RVector<double> output;
Fun(const NumericVector input,NumericVector output, Function fun)
: input(input), output(output), f(fun) {}
void operator()(std::size_t begin, std::size_t end, Rcpp::Function f) {
std::transform(input.begin() + begin, input.end() + end,
output.begin() + begin, as<double>(f)); //Here I have PROBLEMS!!!
}
};
// [[Rcpp::export]]
List lapplyCppParallel(List input, Function f) {
List output(input.size());
Fun fun(input, output, f);
parallelFor(0, input.size(), fun);
return output;
}