“错误:与请求的类型不兼容”随机发生

时间:2015-09-03 12:23:45

标签: c++ r rcpp armadillo

我正在研究一个使用Rcpp和RcppArmadillo的R包,我遇到了一个随机发生的奇怪错误。我无法发布我的函数的所有代码从头开始重现它(它是400 + 300行),但你可以在github上找到包:https://github.com/config-i1/CES - 我使用的函数是在“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

有时会返回错误Error: not compatible with requested type。但这并不是一直发生的(3次运行中大约有1次),因此很难追踪到这个错误。这件事发生在Linux和Windows上。 R只是在Mac OS上崩溃而不是显示错误。

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

  

代码已跳过

我知道我可能做错了但我无法弄清楚是什么。

我很感激你的任何帮助!

谢谢!

更新

我发现代码中的错误是什么。所以,万一有人遇到类似的问题,这就是问题所在以及如何解决问题:

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

在大多数情况下,这种方法运作得很好,但有时由于某种原因,wrap()函数没有做它应该做的事情,结果完全不同的东西被传递给forecaster。 'turn'中传递的值无法转换为forecaster中的NumericMatrix,因此“错误:与请求的类型不兼容”。这很少发生,很难追查。

解决方案是将forecaster个参数更改为所需类型:forecaster(arma::mat matrixxt, arma::mat matrixF), - 直接将值传递给Rcpp中的forecaster,而不是wrap(),然后写一个特殊的Rcpp包装函数(因此可以从R调用forecaster。)

1 个答案:

答案 0 :(得分:2)

欢迎使用StackOverflow。环顾四周,感受哪些问题有用,哪些问题没有。

你的(当前)没有太大的帮助 - 你的代码中只有一个错误,你偶尔会提供一个不匹配的类型。 Rcpp已经取得了一定的成功,使用CRAN的450多个软件包,现在有150个使用RcppArmadillo的软件包。因此,这些类型的对象已被实例化数百万次并代表健壮的代码 - 因此您应该尝试进一步减少问题,直到获得smallest possible reproducible example