在Rcpp中使用带有多个参数的函数和lapply

时间:2014-06-03 14:19:05

标签: c++ rcpp lapply

我正在尝试使用具有多个参数的函数的Rcpp lapply函数。

在R中,可以使用以下代码完成相同的操作。

lapply(y,FUN=function(x)corr(x[,2:ncol(x)],x[,1]))

其中corr是一个带两个参数的函数。

有人可以在Rcpp中为上述情况提供示例代码吗?

1 个答案:

答案 0 :(得分:3)

如果我根据您的最新评论了解您的需求,那么您需要的是mapply而不是sapply,例如:

> mapply( function(a, b) a == b, 1:9, 9:1 )
# [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

Rcpp有mapply(有两个或三个参数)

#include <Rcpp.h>
using namespace Rcpp ;

struct Compare : public std::binary_function<int,int,bool> {   
    bool operator() (int a, int b) const {
        return (a==b);
    } 
};

// [[Rcpp::export]]
LogicalVector test( NumericVector x, NumericVector y){
    return mapply( x, y, Compare() ) ;
}

我倾向于用C ++ 11 lambdas这样写。

// [[Rcpp::export]]
LogicalVector test( NumericVector x, NumericVector y){
    return mapply( x, y, [](double a, double b){ 
            return a == b ;
    } ) ;
}

甚至使用std::equal_to<double>类:

// [[Rcpp::export]]
LogicalVector test( NumericVector x, NumericVector y){
    return mapply( x, y, std::equal_to<double>() ) ;
}

然而,对于这些微不足道的功能,你应该使用糖:

// [[Rcpp::export]]
LogicalVector test( NumericVector x, NumericVector y){
    return x == y ;
}