r - 返回可空值从 Rcpp 到 R 导致段错误
问题描述
使用 Rcpp,我编写了一个 C++ 函数,该函数返回一个 ´Nullable<NumericMatrix>`。从 R 重复调用此函数会使我的 Windows 机器上的 R 会话崩溃,并在我在 Linux 服务器上运行它时导致段错误。
NumericMatrix 本身由另一个 C++ 函数生成,然后“包装”在 ´Nullable<NumericMatrix>` 中。似乎只有在值返回给 R 之前 C++ 函数内部进行更多计算时才会发生错误。一旦 R 尝试访问返回的对象,错误本身似乎就会发生。每次调用 C++ 函数时都不会发生该错误。但是,如果我多次调用它,几乎可以肯定会崩溃。
这是一些代码,一旦我 sourceCPP 它几乎每次都会崩溃:
#include <Rcpp.h>
using namespace Rcpp;
NumericMatrix fun() {
NumericMatrix m (10, 10);
std::fill(m.begin(), m.end(), 42);
return m;
}
int otherCall() {
NumericVector v(1000);
std::fill(v.begin(), v.end(), 7);
return v.length();
}
// [[Rcpp::export]]
Nullable<NumericMatrix> returnNullableObject(int num_it) {
Nullable<NumericMatrix> object = R_NilValue;
object = Nullable<NumericMatrix>(fun());
for (int i = 0; i < num_it; i++) {
otherCall();
}
return object;
}
/*** R
test <- function(n) {
val <- returnNullableObject(1000L)
is.matrix(val)
}
for (i in seq_len(100L)) test()
*/
我是否使用Nullable
错误的课程?它在 R 3.6.1 和 R 4.0.1 上崩溃
> devtools::session_info()
- Session info ------------------------------------------------------------------------------------------------------------------------------------------------
setting value
version R version 4.0.1 (2020-06-06)
os Windows 10 x64
system x86_64, mingw32
ui RStudio
language (EN)
collate German_Germany.1252
ctype German_Germany.1252
tz Europe/Berlin
date 2020-06-16
- Packages ----------------------------------------------------------------------------------------------------------------------------------------------------
package * version date lib source
assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.0.0)
backports 1.1.7 2020-05-13 [1] CRAN (R 4.0.0)
callr 3.4.3 2020-03-28 [1] CRAN (R 4.0.0)
cli 2.0.2 2020-02-28 [1] CRAN (R 4.0.0)
crayon 1.3.4 2017-09-16 [1] CRAN (R 4.0.0)
desc 1.2.0 2018-05-01 [1] CRAN (R 4.0.0)
devtools 2.3.0 2020-04-10 [1] CRAN (R 4.0.0)
digest 0.6.25 2020-02-23 [1] CRAN (R 4.0.0)
ellipsis 0.3.1 2020-05-15 [1] CRAN (R 4.0.0)
fansi 0.4.1 2020-01-08 [1] CRAN (R 4.0.0)
fs 1.4.1 2020-04-04 [1] CRAN (R 4.0.0)
glue 1.4.1 2020-05-13 [1] CRAN (R 4.0.0)
lattice 0.20-41 2020-04-02 [1] CRAN (R 4.0.1)
magrittr 1.5 2014-11-22 [1] CRAN (R 4.0.0)
Matrix 1.2-18 2019-11-27 [1] CRAN (R 4.0.1)
memoise 1.1.0 2017-04-21 [1] CRAN (R 4.0.0)
pkgbuild 1.0.8 2020-05-07 [1] CRAN (R 4.0.0)
pkgload 1.1.0 2020-05-29 [1] CRAN (R 4.0.0)
prettyunits 1.1.1 2020-01-24 [1] CRAN (R 4.0.0)
processx 3.4.2 2020-02-09 [1] CRAN (R 4.0.0)
ps 1.3.3 2020-05-08 [1] CRAN (R 4.0.0)
R6 2.4.1 2019-11-12 [1] CRAN (R 4.0.0)
remotes 2.1.1 2020-02-15 [1] CRAN (R 4.0.0)
rlang 0.4.6 2020-05-02 [1] CRAN (R 4.0.0)
rprojroot 1.3-2 2018-01-03 [1] CRAN (R 4.0.0)
rstudioapi 0.11 2020-02-07 [1] CRAN (R 4.0.0)
sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 4.0.0)
testthat 2.3.2 2020-03-02 [1] CRAN (R 4.0.0)
usethis 1.6.1 2020-04-29 [1] CRAN (R 4.0.0)
withr 2.2.0 2020-04-20 [1] CRAN (R 4.0.0)
解决方案
简短的回答是:Nullable<>
仅用于函数输入,没有其他用途。在上面的示例中替换Nullable<>
为RObject
解决了该问题:
RObject returnNullableObject(int num_it) {
RObject object = R_NilValue;
object = fun();
for (int i = 0; i < num_it; i++) {
otherCall();
}
return object;
}
感谢 Dirk 对Nullable<>
!
推荐阅读
- javascript - 如何制作一个包含一个人所有角色的数组?(discord.js)
- python - 仅用日期组件替换 pandas 列中的混合字符串/日期值
- design-patterns - 观察者模式中是否可以有多个主题?
- java - 使用 2 个模拟依赖项进行测试时,Mokito JUnit 测试失败,其中一个依赖于另一个?
- android - 将 JSON 转换为模型时出错:类型 '_InternalLinkedHashMap
' 不是类型 'String' 的子类型 - c# - 线程安全的高性能随机生成器
- python - 如何使用 csv 嗅探器检测双/连续字符作为分隔符?
- python - Pandas (v 1.1.4) 是否使用带有时区数据类型的已弃用 NumPy datetime64
- asp.net-core - gRPC 似乎没有生成访问服务所需的客户端代码
- python - 创建一个程序,用笛卡尔坐标和极坐标计算矢量结果