Rcpp cannot convert ‘SEXP‘ {aka ‘SEXPREC*‘} to ‘###‘ in return
创始人
2024-05-31 04:02:19

Rcpp cannot convert 'SEXP' {aka 'SEXPREC*'} to '***' in return

  • 引言
  • 代码说明
    • 报错代码
    • 两种修改方法
      • 代码1
      • 代码2

引言

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原因被找到.

SEXPR语言中的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)  #  报错代码

两种修改方法

代码1

> 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)  ## 成功编译

代码2

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的解决方法,建议大家理清RRcpp的逻辑,理解aswrap两个函数,本篇内容到此为止.

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...