在开发使用Rcppunit testing with Catch via the testthat package的R包BayesMallows时.最近,我们注意到一个问题,它在CRAN上造成了LTO问题.下面是一个最小的例子.

首先,我创建一个RCPP包.

Rcpp::Rcpp.package.skeleton()
setwd("anRpackage/")

然后使用Catch添加单元测试:

testthat::use_catch()

然后将描述修改为以下内容:

Package: anRpackage
Type: Package
Title: What the Package Does in One 'Title Case' Line
Version: 1.0
Date: 2023-08-29
Author: Your Name
Maintainer: Your Name <your@email.com>
Description: One paragraph description of what the package does as one or more full sentences.
License: GPL (>= 2)
Imports: Rcpp (>= 1.0.11)
LinkingTo: Rcpp, testthat
Suggests: xml2

如果此时i运行Rcpp::compileAttributes(),则在src/RcppExports.cpp中生成以下条目:

RcppExport SEXP run_testthat_tests(void *);

这一行在CRAN上导致了一个问题,特别是"LTO构建失败:类型违反了C++One定义规则".我们目前已手动修复了该问题,方法是将该行修改为以前的状态,即

RcppExport SEXP run_testthat_tests(SEXP);

然而,每当我重新运行Rcpp::compileAttributes()时,这个SEXP参数被更改为void *.我使用的是R4.3.1,我在Mac和Windows上都经历过这种情况.我运行了测试版本3.1.10和RCPP版本1.0.11.

在Mac上,命令gcc --version返回以下内容:

Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: arm64-apple-darwin22.5.0
Thread model: posix

对于发生了什么,以及如何修复它,有什么建议吗?

推荐答案

该问题是由从基本R创建不正确的接口造成的.该问题已在R Bugzilla中报告,并已在pull request #1274中向RCPP本身添加了修复程序.

在通常的完全反向依赖测试(考虑到要测试的2700多个包,这需要在旧机器上花费一些时间)之后,现在已经合并了这一测试,并且新的开发版本1.0.11.2已经被削减,它可以(像往常一样)从Rcpp drat安装,或者从r-universe(一旦其计划的构建赶上,从大约一个小时开始),或者当然是from the github repo.

特别感谢Iñaki的修复,并感谢您的错误报告.

R相关问答推荐

基于两个现有列创建新列

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

以R为基数排列奇数个图

使用R中的gt对R中的html rmarkdown文件进行条件格式设置表的单元格

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

整数成随机顺序与约束R?

在R中,如何在每个堆叠的条上放置误差条,特别是当使用facet_grid时?

二维样条,严格以一个参数递增

根据元素和前一个值之间的差值过滤矩阵的元素

将饼图插入条形图

R中的时间序列(Ts)函数计数不正确

从一个列表的框架中移除列表包装器

如何删除仅在数据集顶部和底部包含零的行

线性模型斜率在减少原始数据时提供NA

如何在ggplot2中绘制具有特定 colored颜色 的连续色轮

如何计算R glm probit中的线性预测因子?

从R中发出的咕噜声中的BUG?

R中的类别比较

防止正则表达式覆盖以前的语句

整理曲线图、曲线图和点图