【发布时间】:2020-12-20 21:59:39
【问题描述】:
我向 CRAN 提交了一个包,他们要求我将 Rd 文件中的 \dontrun{} 替换为 \donttest{} 并重新提交。我使用\dontrun{} 来包装一些应该抛出错误消息的示例。
在将\dontrun{} 替换为\donttest{} 后,我进行了一些测试,R CMD check 仍然成功,但现在devtools::check() 和R CMD check --as-cran 都失败了,因为\donttest{} 中包含的示例:
checking examples with --run-donttest ... ERROR
经过一番浏览,我了解到 R 4.0.0 已将 R CMD check --as-cran 更改为运行 \donttest 示例。根据R-devel的NEWS:
"R CMD check --as-cran 现在运行 \donttest 示例(由 example() 运行)而不是指示测试人员这样做。这可以通过设置环境变量在开发过程中临时规避 R_CHECK_DONTTEST_EXAMPLES 为假值。”
由于我打算将包重新提交给 CRAN,因此在本地将 _R_CHECK_DONTTEST_EXAMPLES_ 设置为 false 对我没有帮助。
我还在 devtools 问题中发现了 this 最近的讨论,其中 Hadley Wickham 指出:
“一般来说,现在如果你不想在 CRAN 上运行测试,\dontrun{} 更有可能工作,但使用 \dontrun{} 可能会导致初始提交失败。”
所以现在我不知道如何继续,因为如果我重新提交带有所需更改的包,我已经知道它会在R CMD check --as-cran 中引发错误,因此它可能会导致 CRAN 的自动预测试失败。
编辑:
按照here 的建议,我尝试使用if(interactive()){} 而不是\dontrun{}。此解决方案在R CMD check --as-cran 和devtools::check() 中成功,但我认为这不是解决此问题的最合适方法,因为它不适用于example()(引发错误并且不显示其余示例)。 \dontrun{} 与 example() 一起使用效果更好,因为它会打印所有示例,但会删除使用 \dontrun{} 包裹的示例。
【问题讨论】:
-
我投票结束这个问题,因为它更适合
r-package-devel@r-project.org邮件列表......这是一个管理问题而不是编程问题...... -
"我使用 \dontrun{} 来包装一些应该抛出错误消息的示例。" - 也许只是从示例中删除这些,而是将它们用于测试单元测试?或者这些抛出错误的示例是否需要用户理解包?
-
@SteffenMoritz 删除这些示例确实可以修复 R CMD 检查中的错误。但是在这个包中,我有一些函数可以根据某些条件停止执行并显示信息性错误消息,我认为说明这一点会很有用(甚至认为不是必需的)。
-
发布了一个答案 :) 我经常看到的是,人们在示例中添加内容,但将其注释掉。可能是一个很好的妥协。
-
@SteffenMoritz 你是对的,文档将在我试图不运行的示例行中包含
if(interactive()),从这个意义上说,\donttest{}将导致“更整洁”的文档因为\donttest{}没有打印出来。但我不认为\donttest{}在这里是一个选项,因为它会在运行R CMD check --as-cran时返回实际错误(以及在运行example()时)。但这与\dontrun相比仍然是一个改进,因为\dontrun是也打印到文档中。