2016-05-02 10 views
2

Iは以下のような引数の1つとして、Rの機能を有するCPPの機能を有する:Rcpp :: FunctionをNULLにできますか?

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

funcが機能することができ、またはそれはNULLであってもよいです。これをどのように実装できますか?そして、ラインを

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

:私はこれを行う場合、私はちょうどとしてmycppfunctionを定義した場合、

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

一方:

func(x) 

は私にエラーを与える

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

は、NULLのVALUでコードを実行しますfuncのeはsegfault: "memory not mapped"という結果になります。

答えて

2

はい、あなたはこれを行うことができますが、私はあなたが渡された関数と引数の互換性を検証することに注意していることを助言します。戻り値の型としてSEXPの使用とRcpp::wrap((double)...)はただでコンパイラを黙らしたことを

#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 

*/ 

注:ここで小さな例はfが有効な関数であることを保証するために最小限守備のコードで、ですこの具体的な例は、あなたのユースケースに必ずしも当てはまるとは限りません。

+1

ありがとうございました!出来た。 – Marsha

関連する問題