C++ Rcpp中apply函数的实现

C++ Rcpp中apply函数的实现,c++,rcpp,syntactic-sugar,C++,Rcpp,Syntactic Sugar,到目前为止,我一直在尝试在Rcpp中实现apply函数,代码如下所示 //[[Rcpp::export]] NumericVector apply(NumericMatrix x,int dim,Function f){ NumericVector output; if(dim==1){ for(int i=0;i<x.nrow();i++){ output[i]=f(x(i,_)); } } else if(dim==2){ for(i

到目前为止,我一直在尝试在Rcpp中实现apply函数,代码如下所示

//[[Rcpp::export]]
NumericVector apply(NumericMatrix x,int dim,Function f){
  NumericVector output;
  if(dim==1){
   for(int i=0;i<x.nrow();i++){
     output[i]=f(x(i,_));
   }    
  }
  else if(dim==2){
   for(int i=0;i<x.ncol();i++){
     output[i]=f(x(_,i));
   }
  }
  return(output);
} 
/[[Rcpp::export]]
数值向量应用(数值矩阵x、整数尺寸、函数f){
数字矢量输出;
如果(dim==1){

对于(int i=0;i而言,答案依次为“是”和“是”,您可能需要阅读“Rcpp简介”,其中包含以下
lappy()
示例:

R> src <- '
+   Rcpp::List input(data);
+   Rcpp::Function f(fun);
+   Rcpp::List output(input.size());
+   std::transform(input.begin(), input.end(), output.begin(), f);
+   output.names() = input.names();
+   return output;
+   '
R> cpp_lapply <- cxxfunction(signature(data = "list", fun = "function"),
+    src, plugin = "Rcpp")

R>src cpp\u lappy对于
apply
没有糖函数。最简单的方法是将
称为
,即:

output[i]=as<double>(f(x(i,_)));
这样你就可以:

// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double> f){
  if(dim==1){
    NumericVector output(x.nrow());
    for(int i=0;i<x.nrow();i++){
      output[i]=f(x(i,_));
    } 
    return output ;
  }
  else {
    NumericVector output(x.ncol());

    for(int i=0;i<x.ncol();i++){
      output[i]=f(x(_,i));
    }  
    return output ;
  }
} 
然后签名将变成:

// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double,NumericVector> f){
/[[Rcpp::export]]
数值向量应用(数值矩阵x,整数维,F){

我还尝试将返回值显式转换为double,但这似乎不如
显式转换为
double
那样有效。代码的另一个问题是
输出的大小不正确。因此,即使在这两个位置添加
as
,也不会得到正确的结果你想要什么,作为奖励,当你指定越界,并且Rcpp不进行边界检查时,你会得到未定义的行为。@RomainFrancois感谢你指出这一点。:)谢谢你的回答:),函数的参数是一个数字向量,它返回一个双值。谢谢@Romain Francois,这是一个更广义的解决方案:)好吧,这实际上是在回答问题,而不是抛出模糊相关的东西。我也不清楚函数对象。它类似于函数点吗你能给我一些指针来学习RCPP中的函数对象吗?<代码>函数< /> >是一个RCPP API类,它封装了一个R函数对象,并允许你用C++ <代码>操作器()/<代码>调用函数。
template <typename T, typename... Args>
class F {
public: 
  F( SEXP f_) : f(f_){}

  inline T operator()(Args... args){
    return as<T>(f(args...)) ;  
  }

private:
  Function f ;
} ;
// [[Rcpp::export]]
NumericVector apply_cpp(NumericMatrix x,int dim,F<double,NumericVector> f){