我使用Rcpp写了一个C++函数,返回一个 "Nullable<NumericMatrix>`。从R中反复调用这个函数会使我在windows机器上的R会话崩溃,并且当我在Linux服务器上运行它时,会导致一个segfault错误。
NumericMatrix本身是由另一个C++函数生成的,然后 "包装 "在 "Nullable<NumericMatrix>`中。似乎只有在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;
}
谢谢你的评论和澄清,关于使用 Nullable<>
!