は、ユーザが、それはcaller
によって使用され、関数名「楽しい」を渡すことができRcppArmadilloユーザ定義関数を渡す
## ----------- R version -----------
caller <- function(x=1:3, fun = "identity", ...){
## do some other stuff
## ...
## then call the function
eval(call(fun, x))
}
fun1 <- function(x, ...){
x + x
}
fun2 <- function(x, a = 10) a * x
caller(fun = "fun1")
caller(fun = "fun2")
、以下のRコードを考えます。 RcppArmadillo
オブジェクトで同じタスクを実行したいと思います(より複雑なタスクの一部として、明らかに)。関数はC++
で定義され、ユーザーはその名前を参照することにより、Rのレベルでそれを選択することになります。
caller_cpp(1:3, "fun1_cpp")
または
caller_cpp(1:3, "fun2_cpp")
など
がここには私の素朴な試みですコンパイルに失敗した呼び出し元関数:
## ----------- C++ version -----------
library(Rcpp)
require(RcppArmadillo)
sourceCpp(code = '
// [[Rcpp::depends("RcppArmadillo")]]
#include <RcppArmadillo.h>
using namespace arma ;
using namespace Rcpp ;
colvec fun1_cpp(const colvec x)
{
colvec y ;
y = x + x;
return (y);
}
colvec fun2_cpp(const colvec x)
{
colvec y ;
y = 10*x;
return (y);
}
// mysterious pointer business in an attempt
// to select a compiled function by its name
typedef double (*funcPtr)(SEXP);
SEXP putFunPtrInXPtr(SEXP funname) {
std::string fstr = Rcpp::as<std::string>(funname);
if (fstr == "fun1")
return(Rcpp::XPtr<funcPtr>(new funcPtr(&fun1_cpp)));
else if (fstr == "fun2")
return(Rcpp::XPtr<funcPtr>(new funcPtr(&fun2_cpp)));
}
// [[Rcpp::export]]
colvec caller_cpp(const colvec x, character funname)
{
Rcpp::XPtr fun = putFunPtrInXPtr(funname);
colvec y ;
y = fun(x);
return (y);
}
')
を編集してください:RcppDEを見るためのDirkの提案に従ってください。
ありがとうございます。うまくいけば、私の完全なC++の無知は、私がまだ物事をコピーして貼り付けるのを妨げないでしょう。 – baptiste
残念ながら、RcppDEにはあまりにも多くのことがあります。 'evaluate.h'では、新しいクラスが定義されていることが分かります。おそらく、任意のR関数を呼び出すかもしれません。親切な魂が余裕を持っていれば、素敵なhttp://gallery.rcpp.org/で最小限の例が得られます。 – baptiste
ビネットを読み取ると、コードを見ている印象が確認されます。名前で選択されたコンパイルされた関数のみを処理したい場合は、この仮想クラスビジネスが必要ですか? – baptiste