Использование функций с несколькими аргументами с lapply в Rcpp

0

Я пытаюсь использовать функцию Rapp lapply с функциями с несколькими аргументами.

В R то же самое можно сделать со следующим кодом.

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

где corr - функция, которая принимает два аргумента.

Может ли кто-нибудь привести пример кода в Rcpp для вышеуказанной ситуации?

  • 1
    Сделайте то же самое в C ++, передайте lapply функцию, которая принимает один аргумент.
  • 0
    Можете быть более конкретными. Какой код на С ++ вы пробовали?
Показать ещё 2 комментария
Теги:
rcpp
lapply

1 ответ

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

который я хотел бы писать так с С++ 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 ;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню