我有一个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;。
答案 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)...)
只是为了在这个特定示例中安静编译器,并且不一定适用于您的用例。