RcppParallel:尝试实现lapply但并行的方法

时间:2014-12-13 20:17:40

标签: rcpp

我试图像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;
}

0 个答案:

没有答案