Rcpp 函数在打包时使 RStudio 崩溃
Rcpp function crashes RStudio when packaged
我使用带有单个函数的Rcpp.package.skeleton(myPackage)
构建了一个虚拟的 Rcpp 包:
// [[Rcpp::export]]
double triple_balance(const double& balance) {
if(R_IsNA(balance)) {
stop("balance is NA, please provide a numeric value");
} else {
double result = balance*3;
return result;
}
}
在单元测试中,我想确保该函数在传递错误的输入时返回错误,如果我提供它,它会始终这样做:
Rcpp::sourceCpp('src/triple_balance.cpp')
triple_balance("10")
triple_balance("10"( 中的错误: 与请求的类型不兼容:[类型=字符;目标=双精度]。
但是,如果我安装并重新启动软件包,则运行triple_balance("10")
会使 RStudio 崩溃。我应该补充一点,崩溃不会每次都发生,它似乎取决于库的初始状态,例如我之前是否安装了以前版本的包,例如在函数定义中是否带有const
。
什么可以解释这种不一致的行为?
我的sessionInfo
:
> sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server 7.8 (Maipo)
Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] rcppDummy_1.0
loaded via a namespace (and not attached):
[1] compiler_3.6.0 tools_3.6.0 Rcpp_1.0.2 packrat_0.5.0
在用例中
Rcpp::sourceCpp('src/triple_balance.cpp')
triple_balance("10")
错误是你的,因为当你的界面正在使用double
double triple_balance(const double& balance)
这不是你输入"10"
时提供的 - 这是一个字符 矢量(或"字符串"(!
如果你使用向量参数,你可以用 Rcpp 自动捕捉到这一点:
// [[Rcpp::export]]
NumericVector triple_balance(const NumericVector & balance) {
return balance * 3;
}
现在,这将检查何时实例化 Rcpp 数据结构:
R> triple_balance(10)
[1] 30
R> triple_balance(10L)
[1] 30
R> triple_balance("10")
Error in triple_balance("10") :
Not compatible with requested type: [type=character; target=double].
R>
最重要的是,它可以在向量上自动工作:
R> triple_balance(c(c(2,3), seq(10,30,by=10), log10(1:3)))
[1] 6.00000 9.00000 30.00000 60.00000 90.00000 0.00000 0.90309 1.43136
R>
并且还处理非有限值:
R> triple_balance(c(10, NA, NaN, Inf, -Inf))
[1] 30 NA NaN Inf -Inf
R>
编辑顺便说一句,如果我将您的版本保留在源文件中并附加_orig
,它对我来说也可以正常工作(Ubuntu 20.04;当前的 Rcpp(
R> triple_balance_orig("10")
Error in triple_balance_orig("10") :
Not compatible with requested type: [type=character; target=double].
R> packageVersion("Rcpp")
[1] ‘1.0.4.11’
R>
这种行为不是新代码,所以我有点惊讶它会让你的 RHEL 安装崩溃。
编辑2:为了论证,我也把它做成一个包,它也不会让RStudio崩溃。 我正在运行最新的测试版本 1.4.390。(我已经看到在重新编译软件包和错误时出现这样的崩溃,它可能会发生。 它不应该在这里发生。
您可以在 https://rstudio.cloud 中尝试您的代码,以快速尝试不同的环境。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Rcpp 函数在打包时使 RStudio 崩溃
- RStudio 不断崩溃与 Rcpp