2017-04-25 45 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

相關問題