Rcpp :: Function可以为NULL吗?

时间:2016-05-02 22:28:58

标签: r rcpp

我有一个cpp函数,它有一个R函数作为它的一个参数,如下所示:

void mycppfunction(SEXP x, Rcpp::Function func)

func可以是一个函数,也可以是NULL。我该如何实现呢?如果我这样做:

void mycppfunction(SEXP x, Rcpp::Nullable<Rcpp::Function> func)

然后,行:

func(x) 

给我错误:

error: no match for call to ‘(Rcpp::Nullable<Rcpp::Function_Impl<Rcpp::PreserveStorage> >) (SEXP)’

另一方面,如果我只是将mycppfunction定义为:

void mycppfunction(SEXP x, Rcpp::Function func)

然后为func运行带有NULL值的代码导致段错误:&#34;内存未映射&#34;。

1 个答案:

答案 0 :(得分:2)

是的,你可以这样做,但我建议你注意验证传入的函数和参数的兼容性。这是一个小例子,使用 minimal 防御代码来确保f是一个有效的函数:

#include <Rcpp.h>

typedef Rcpp::Nullable<Rcpp::Function> nullable_t;

// [[Rcpp::export]]
SEXP null_fun(Rcpp::NumericVector x, nullable_t f = R_NilValue) {
    if (f.isNotNull()) {
        return Rcpp::as<Rcpp::Function>(f)(x);
    }
    return Rcpp::wrap((double)Rcpp::sum(x));
}

/*** R

null_fun(1:5)
#[1] 15

null_fun(1:5, mean)
#[1] 3

null_fun(1:5, min)
#[1] 1

null_fun(1:5, max)
#[1] 5

*/

请注意,使用SEXP作为返回类型和Rcpp::wrap((double)...)只是为了在这个特定示例中安静编译器,并且不一定适用于您的用例。