问题描述
我向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{}
包装的示例。
解决方法
如果您知道某些东西会引发错误,则可以将其包装在try()
中。
## example of failing code
try(stop("Here is an error"))
,
我不认为软件包示例适合“应该抛出错误消息的示例” 。
将这些“示例”移至testthat单元测试中,即可轻松解决您的问题。
有
expect_error()
expect_warning()
查看您的包裹是否按预期抛出警告/错误。
如果您真的想告知用户应该避免输入的内容,也许您可以将其作为示例或其他文档的注释添加(详细信息,参数)
您在其他包装示例中经常看到的内容如下:
## Example for working
function(x,abc = "5)
## This would give an error because
# function(x,abc = "falsch")
## Working example 2
function(x)
x <- x+y