C++ &引用;错误:与请求的类型“不兼容”;随意发生的

C++ &引用;错误:与请求的类型“不兼容”;随意发生的,c++,r,rcpp,armadillo,C++,R,Rcpp,Armadillo,我目前正在开发一个使用Rcpp和RcppArmadillo的R包,我遇到了一个随机发生的奇怪错误。我不能发布所有函数的代码来从头开始复制它(400+300行),但是你可以在github上找到包:-我使用的函数在“R/ces.R”文件中,它取决于“src/cesfun.cpp”中的函数 因此,当您安装软件包(devtools::install_github(“config-i1/CES”))并运行以下命令时: library('Mcomp') x <- cbind(c(rep(0,25),1

我目前正在开发一个使用Rcpp和RcppArmadillo的R包,我遇到了一个随机发生的奇怪错误。我不能发布所有函数的代码来从头开始复制它(400+300行),但是你可以在github上找到包:-我使用的函数在“R/ces.R”文件中,它取决于“src/cesfun.cpp”中的函数

因此,当您安装软件包(
devtools::install_github(“config-i1/CES”)
)并运行以下命令时:

library('Mcomp')
x <- cbind(c(rep(0,25),1,rep(0,43)),c(rep(0,10),1,rep(0,58)))
ces(ts(c(M3$N1457$x,M3$N1457$xx),frequency=12),h=18,holdout=T,intervals=T,seasonality="F",xreg=x,trace=T)->test
library('Mcomp')
x检验
错误
错误:有时返回与请求的类型不兼容的
。但这种情况并非总是发生(大约3次运行中有1次),因此很难跟踪此错误。这种情况在Linux和Windows上都会发生。而R只是在Mac OS上崩溃,而没有显示错误

我实际上已经尝试过进行调查,发现当调用下面的Rcpp函数时,错误发生在for循环中的随机迭代中

跳过的代码

我知道我可能做错了什么,但我不知道是什么

我将非常感谢在这方面的任何帮助

谢谢大家!

更新。

我发现了代码中的错误。因此,如果有人遇到类似的情况,下面是问题所在以及解决方法:

我在代码的不同部分使用了从R和Rcpp调用的同一个函数。因此变量被定义为SEXP:
forecaster(SEXP-matxt,SEXP-matF)
。因此,当我在Rcpp中调用函数时,我需要使用
wrap()
arma:mat
变量转换为
SEXP
。电话是这样的:
预报员(wrap(matrixxt)、wrap(matrixF))

在大多数情况下,这种方法工作得非常好,但有时由于某种原因,
wrap()
函数没有完成它应该做的事情,因此将完全不同的内容传递给了
预报员。在
forecaster
中,传递的值无法转换为NumericMatrix,因此“错误:与请求的类型不兼容”。这种情况很少发生,而且很难追踪


解决方案是将
forecaster
参数更改为所需的类型:
forecaster(arma::mat matrixxt,arma::mat matrixF)
,直接将值传递给Rcpp中的
forecaster
,而不使用
wrap()
,并编写一个特殊的Rcpp包装函数(因此可以从R调用
forecaster
)欢迎来到StackOverflow。环顾四周,了解哪些问题有帮助,哪些问题没有帮助


你的代码(目前)没有太大的帮助——你只是在代码中有一个bug,每隔一段时间你就会提供一个不匹配的类型。Rcpp已经取得了一定的成功,CRAN上使用它的软件包超过450个,现在有150个使用RcppArmadillo。因此,这些类型的对象已经被实例化了数百万次,并且代表了健壮的代码——因此,您应该尝试进一步减少您的问题,直到您获得了解决方案。

感谢您的热烈欢迎!我读过很多关于Rcpp的文章,但不幸的是,我找不到任何关于“与请求的类型不兼容”的解释。我终于找到了问题所在-请参阅问题中的更新。我以后尽量不要问愚蠢的问题:)。谢谢另一个可能的问题是您没有保护从垃圾收集器传入的
SEXP
对象。一旦您使用
wrap()
生成
SEXP
对象,现在保护的责任就在您身上了(而对于Rcpp类,在对象构造/销毁时处理underyling R数据的保护),谢谢您!这实际上是有道理的,并解释了“随机”行为。有没有办法保护
SEXP
对象?应该使用什么?