Rcpp函数在打包时使RStudio崩溃。

问题描述 投票:0回答:1

我使用下面的命令建立了一个虚拟的Rcpp包。Rcpp.package.skeleton(myPackage) 的一个函数。

// [[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 
c++ r rstudio rcpp
1个回答
5
投票

在使用案例中

Rcpp::sourceCpp('src/triple_balance.cpp')
triple_balance("10")

错误是你的,因为当你的界面使用了 double

double triple_balance(const double& balance)

也就是 您输入的内容 "10" -- 那是一个字符向量(或 "字符串")!如果你使用向量参数,你可以在Rcpp中自动MAGICIC地捕捉到这一点。

如果你使用向量参数,你可以用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)。 迅速尝试不同的环境。

© www.soinside.com 2019 - 2024. All rights reserved.