Search code examples
rlapplyrcpp

Using functions with multiple arguments with lapply in Rcpp


I am trying to use Rcpp lapply function with functions with multiple arguments.

In R the same can be done with the following code.

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

where corr is a function that takes two arguments.

Can anybody give an example code in Rcpp for the above situation?


Solution

  • If I understand what you want correctly, based on your latest comments, what you need is mapply rather than sapply, e.g. :

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

    Rcpp has mapply (for two or 3 arguments)

    #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() ) ;
    }
    

    which I would tend to write like this with C++11 lambdas.

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

    Or even using the std::equal_to<double> class:

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

    However, for such trivial functions, you should be using sugar:

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