【问题标题】:Rcpp functions cause crash in package [closed]Rcpp函数导致包崩溃[关闭]
【发布时间】:2021-05-18 04:54:21
【问题描述】:

我有一个包,https://github.com/tfrostig/RSEE,其中包括几 (3) 个 RcppArmadillo 函数。该软件包在其他计算机上运行良好。当我构建包时没有出现错误,但每当我调用任何 RCPP 函数时,它都会导致 R 崩溃。

当我尝试使用单元测试时,我收到错误消息:“Exited with status -1073741819”。

如果我使用Rcpp::sourceCpp() 然后调用函数,一切正常。其他带有 Rcpp 功能的包运行良好。

例如:

`// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
using namespace Rcpp;
using namespace arma;


// [[Rcpp::export]]
arma::mat localRegression(arma::mat weightmat, arma::mat modelmat, arma::vec xtemp) {
  return inv(modelmat.t() * weightmat * modelmat) * modelmat.t() * weightmat * xtemp;
}

使用RSEE:::localRegression 会导致它崩溃。如果我使用sourceCpp 加载源代码,然后调用localRegression 就可以了。

什么会导致此类问题?

The session info is: 
R version 4.0.3 (2020-10-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19042)

Matrix products: default

locale:
[1] LC_COLLATE=English_Israel.1252  LC_CTYPE=English_Israel.1252    LC_MONETARY=English_Israel.1252
[4] LC_NUMERIC=C                    LC_TIME=English_Israel.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RSEE_0.1.0

loaded via a namespace (and not attached):
[1] compiler_4.0.3 tools_4.0.3    Rcpp_1.0.6    

【问题讨论】:

  • 使用手动设置的断点遍历该函数并查看它在哪个点杀死您的进程可能是有意义的。
  • 当我调用该函数时。当不在包内调用时,这些函数运行良好。
  • 哪个功能/单元测试失败了?失败时您使用的是哪个操作系统?什么时候不失败?
  • 我已经添加了会话信息和示例。

标签: r package rcpp rcpparmadillo


【解决方案1】:

看看你的包,我假设错误和崩溃来自src/RCPP_LOWESS.cpp中的 arma::mat iterLowess(..., double epsmed = 10^(-6)) {。请注意,^ 不是 Cpp 中的电源操作,而是byte XOR operation。此外,10 是一个整数,而 10.0 是一个双精度数,所以当编译器“应该”进行自动转换时,它可能会失败。

试一试

library(Rcpp)
f <- cppFunction('double powww(double x = 10^(-6)){
                 double y = x^2;
                 return y;}')

您会注意到这会引发错误。

几乎不可能给你一个准确的答案,因为我们在问题中的信息非常有限,但是因为你提到它在调用函数时立即崩溃(我假设它在调试状态下也是如此)我们应该查看错误的函数定义。

【讨论】:

  • 谢谢!它起作用了,当我调用每个 Rcpp 函数时发生崩溃,但是在应用您的建议后它起作用了。您知道是什么原因导致它在一台计算机上工作而不是在另一台计算机上工作吗?另外,它是如何使用 Rcpp::sourceCpp 编译好的?
  • 如果您真的是指两台不同的计算机,则可能是编译器(版本或类型)或操作系统不同。也许clang-c++ 实际上会处理这个错误(我认为这会导致意外行为),而另一个编译器(如 Gcc 或 MVSC++)不会。也许 gcc 的第 8 版可以处理它?谁知道。在我们甚至可以猜测为什么会出现这种情况之前,我们需要更多的信息。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多