2017-04-25 42 views
0

这可能是一个基本问题,我一直在努力将用户创建的C++函数传递给Rcpp。我阅读了文档,似乎我应该使用XPtr提供的SEXP包装(链接:http://gallery.rcpp.org/articles/passing-cpp-function-pointers/)但是,我仍然不太清楚如何正确执行此操作。在接下来的内容中,我想使用一个函数funcPtrG作为testfun中的一个参数,C++方式。我得到了如下错误:传递用户在rcpp中创建C++函数作为参数

 #include <RcppArmadillo.h> 
     typedef double (*funcPtrG)(double theta, double gamma); 
     using namespace Rcpp; 

    // [[Rcpp::export]] 
    double GGfuncpp(double theta, double gamma){ 
     double new_gamma = 0; 
     new_gamma = theta*gamma + R::rnorm(0,1)*0.0001; 
     return new_gamma; 
    } 
    // [[Rcpp::export]] 
    double testfun(funcPtrG fun2, double theta, double gamma){ 
     double x= 0; 
     x = fun2(theta,gamma); 
     return x; 
    } 

    Error: cannot convert 'SEXP' to 'double (*)(double, double)' in initialization 

我试图把x = XPtr<funcPtr>fun2(theta,gamma)但没有给出期望的结果。

+0

我愿意!对不起,我会编辑。在我原来的程序中,我有// [[Rcpp :: export]]在所有函数之前 – dleal

回答

5

IIUC,您正在寻找这样的事情:

#include <Rcpp.h> 
using namespace Rcpp; 

typedef double (*funcPtrG)(double theta, double gamma); 
typedef XPtr<funcPtrG> fptr_t; 

// [[Rcpp::export]] 
double GGfuncpp(double theta, double gamma) 
{ 
    Rcout << "GGfuncpp called\n"; 
    double new_gamma = 0; 
    new_gamma = theta*gamma + R::rnorm(0, 1) * 0.0001; 
    return new_gamma; 
} 

// [[Rcpp::export]] 
double GGfuncpp2(double theta, double gamma) 
{ 
    Rcout << "GGfuncpp2 called\n"; 
    return 1.0; 
} 

// [[Rcpp::export]] 
fptr_t make_GGfuncpp() 
{ 
    return fptr_t(new funcPtrG(GGfuncpp)); 
} 

// [[Rcpp::export]] 
fptr_t make_GGfuncpp2() 
{ 
    return fptr_t(new funcPtrG(GGfuncpp2)); 
} 

// [[Rcpp::export]] 
double testfun(fptr_t fun2, double theta, double gamma) 
{ 
    double x= 0; 
    x = (*fun2)(theta, gamma); 
    return x; 
} 

/*** R 

fptr1 <- make_GGfuncpp() 
fptr2 <- make_GGfuncpp2() 

testfun(fptr1, 1, 5) 
# GGfuncpp called 
# [1] 5.000084 

testfun(fptr2, 1, 5) 
# GGfuncpp2 called 
# [1] 1 

*/ 

R没有一个funcPtrG的任何概念,所以你不能直接把它作为一个函数参数类型。相反,这些对象需要封装在XPtr模板中。 make_GGfuncppmake_GGfuncpp2函数提供了在R端创建XPtr<funcPtrG>实例的方法,然后可以通过函数参数将它们传回给C++。

+0

这对我的目的很有效。谢谢 – dleal

+2

那个......唯一...... @nrussell女士们,先生们! – coatless

相关问题