gpt4 book ai didi

c++ - Rcpp 函数在打包时使 RStudio 崩溃

转载 作者:行者123 更新时间:2023-12-01 14:15:55 26 4
gpt4 key购买 nike

我使用具有单一功能的 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")

Error in triple_balance("10") : Not compatible with requested type: [type=character; target=double].

但是,如果我安装并重新启动包,运行 triple_balance("10") 会使 RStudio 崩溃。我应该补充一点,崩溃并不是每次都会发生,它似乎取决于库的初始状态,例如我之前是否安装了以前版本的包,例如在函数定义中有或没有 const

什么可以解释这种不一致的行为?

我的 session 信息:

> 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" 时提供的内容 -- 那是一个字符 vector (或“字符串”)!

如果你使用 vector 参数,你可以用 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>

最重要的是,它可以自动对 vector 进行处理:

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 中尝试您的代码快速尝试不同的环境。

关于c++ - Rcpp 函数在打包时使 RStudio 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62061935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com