R应用集成testthat报错:Error in x[[method]](...) : attempt to apply non-function
解决非包R项目使用testthat时的"attempt to apply non-function"错误
我之前在非包项目里硬凑DESCRIPTION用testthat的时候,也踩过一模一样的坑!这个错误看起来摸不着头脑,其实大多是因为DESCRIPTION的格式不符合testthat的预期,或者调用测试的方式不对。给你几个靠谱的排查和解决步骤:
1. 先把DESCRIPTION的格式补全规范
testthat哪怕是在非包项目里,也会默认按照R包的DESCRIPTION规则来读取信息,缺必填字段或者格式不对就会触发奇怪的错误。你至少要把这些字段写对:
Package: YourAppName # 随便取个项目名,不能空 Version: 0.0.1 # 版本号要符合x.y.z的格式 Title: Short App Description # 简短的项目标题 Description: Longer description of your R application. # 项目的详细描述 License: MIT + file LICENSE # 随便选一个许可证占位即可
注意字段名是大小写敏感的,比如Package不能写成package,每个字段的冒号后面要留空格。
2. 别用devtools的测试命令,直接调用testthat的目录测试
devtools::test()是专门给R包设计的,非包项目用它会触发很多包相关的逻辑,容易出问题。你应该直接指定测试目录来运行:
testthat::test_dir("tests/testthat")
前提是你的测试文件都放在tests/testthat目录下,而且文件名必须以test-开头(比如test-utils.R),testthat才会识别。
3. 排查可能的缓存问题
如果之前用devtools跑过测试,R会话可能缓存了错误的包信息。直接重启R会话,然后再用testthat::test_dir()重新运行测试,很多时候就能解决问题。
4. 检查测试文件的目录结构
有时候空测试文件如果目录放错了(比如没放在tests/testthat下),或者命名不符合规则,也会触发奇怪的错误。确认你的项目结构是这样的:
你的项目根目录/ ├── DESCRIPTION └── tests/ └── testthat/ └── test-something.R # 空文件也可以,但命名必须以test-开头
按这几步来,应该就能解决那个"attempt to apply non-function"的错误了!
内容的提问来源于stack exchange,提问作者Teodor Ciuraru
相关产品推荐
相关产品推荐

