打包后,Rcpp函数会使RStudio崩溃

时间:2020-05-28 09:59:09

标签: c++ r rstudio rcpp

我使用具有单个功能的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”)错误: 与请求的类型不兼容:[type = character; target = double]。

但是,如果我安装并重新启动软件包,运行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 

1 个答案:

答案 0 :(得分:5)

在用例中

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中尝试使用您的代码来快速尝试其他环境。