调用rstan的R包开发中控制台测试通过但devtools::test()运行失败
问题原因
devtools::test()运行时会加载隔离的测试环境,S3方法查找逻辑和普通控制台、RStudio「Run Tests」的运行环境存在差异:你开发的R包没有显式导入rstan针对stanfit类对象的summary S3方法,测试环境中调用summary(fit)时无法匹配到对应方法,回退调用base::summary处理stanfit对象,返回结果为原子向量而非带summary属性的列表,因此触发$运算符对原子向量无效的报错。
解决方案
你可以任选以下任意一种方案修复问题:
- 最简方案:直接显式调用rstan的summary方法,无需修改包配置,将报错行修改为:
rstan::summary(fit)$summary - 包导入配置修改:如果你的包内频繁使用stanfit对象的summary方法,可以在包的roxygen注释中添加导入声明:
之后运行#' @importFrom rstan summary NULLdevtools::document()更新包的NAMESPACE文件即可,测试环境会自动匹配到对应的S3方法。 - 测试环境单独注册:如果不想修改包的全局导入配置,可在测试文件开头添加注册代码,强制测试环境识别对应S3方法:
registerS3method("summary", "stanfit", rstan::summary.stanfit)
验证方法
你可以在原报错行前添加如下代码,确认方法匹配逻辑:
# 确认fit的类是stanfit print(class(fit)) # 确认当前环境能不能找到stanfit对应的summary方法 print(attr(methods("summary"), "info")[grepl("stanfit", rownames(attr(methods("summary"), "info"))), ]) # 打印summary(fit)的类型和内容,确认是不是走了base的summary print(class(summary(fit))) print(summary(fit))
内容的提问来源于stack exchange,提问作者half-pass
相关产品推荐
相关产品推荐

