Rcpp在使用的过程中可以访问R本地的一些函数,可以帮助我们更高效的进行计算.
Rcpp::Environment global = Rcpp::Environment::global_env();
可以在Rcpp中访问R的全局环境.
Rcpp::Function as = global["f"];
可以将R全局环境中的函数f转为Rcpp中as函数.
下面是上述过程中的一个示例:
> f = function(x,p) return(x[1:p])
> code = '#include
+ using namespace Rcpp;
+ //[[Rcpp::export]]
+
+ NumericVector f1(NumericVector x, int p){
+ Rcpp::Environment global = Rcpp::Environment::Environment::global_env();
+ Rcpp::Function as = global["f"];
+ return as(x,p);}'
>
> Rcpp::sourceCpp(code = code)
> f1(1:10,3) # Rcpp定义的函数f1成功编译
[1] 1 2 3
所以在接下来的尝试中遇到了bug. 以下是报错的代码.
> Rcpp::sourceCpp(code = code)
"E:/rtools40.1/mingw64/bin/"g++ -std=gnu++11 -I"E:/R-4.1.2/include" -DNDEBUG -I"E:/R-4.1.2/library/Rcpp/include" -I"C:/Users/jls/AppData/Local/Temp/RtmpURw0pW/sourceCpp-x86_64-w64-mingw32-1.0.7" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c file1b805b366359.cpp -o file1b805b366359.o
file1b805b366359.cpp: In function 'double F(Rcpp::NumericVector, int)':
file1b805b366359.cpp:7:25: error: cannot convert 'SEXP' {aka 'SEXPREC*'} to 'double' in returnreturn as(x1,h1);}^
make: *** [E:/R-4.1.2/etc/x64/Makeconf:245锛歠ile1b805b366359.o] 閿欒 1
Error in Rcpp::sourceCpp(code = code) : Error 1 occurred building shared library.
经过自己的多次试错,上述bug原因被找到.
SEXP是R语言中的S表达式,Rcpp返回的数据类型即为SEXP,自然而然地如果将bug中的返回类型改为SEXP即可正常编译;当然如果为了方便后续的计算强行转为自己所要的数据类型需要使用as函数.
如果大家不明白上述的意思,请看下面的代码说明.


以下gam实现的是上述图片的过程.
code = '#include
+ using namespace Rcpp;
+ //[[Rcpp::export]]
+ double F(NumericVector x1, int h1){
+ Rcpp::Environment global = Rcpp::Environment::global_env();
+ Rcpp::Function as = global["gam"];
+ return as(x1,h1);}'
> Rcpp::sourceCpp(code = code) # 报错代码
> code = '#include
+ using namespace Rcpp;
+ //[[Rcpp::export]]
+ SEXP F(NumericVector x1, int h1){
+ Rcpp::Environment global = Rcpp::Environment::global_env();
+ Rcpp::Function as = global["gam"];
+ return as(x1,h1);}'
>
> Rcpp::sourceCpp(code = code) ## 成功编译
code = '#includeusing namespace Rcpp;//[[Rcpp::export]]double F(NumericVector x1, int h1){Rcpp::Environment global = Rcpp::Environment::global_env();Rcpp::Function as = global["gam"];return Rcpp::as(as(x1,h1));}'Rcpp::sourceCpp(code = code)
以上就是文章标题Rcpp cannot convert ‘SEXP’ {aka ‘SEXPREC*’} to ‘###’ in return出现bug的解决方法,建议大家理清R与Rcpp的逻辑,理解as和wrap两个函数,本篇内容到此为止.