CRAN 要求将 \dontrun{} 替换为 \donttest{} 后 R 包中的问题

Issues in R package after CRAN asked to replace \dontrun{} by \donttest{}

我向 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 now runs \donttest examples (which are run by example()) instead of instructing the tester to do so. This can be temporarily circumvented during development by setting environment variable R_CHECK_DONTTEST_EXAMPLES to a false value."

因为我打算重新提交包到CRAN,所以在本地设置_R_CHECK_DONTTEST_EXAMPLES_false对我没有帮助。

我还发现 this 最近在一个 devtools 问题中的讨论,其中 Hadley Wickham 指出:

"Generally, now if you don't want to run tests on CRAN \dontrun{} is more likely to work, but using \dontrun{} may cause initial submission to fail."

所以现在我不知道如何继续,因为如果我重新提交包含所需更改的包,我已经知道它会在 R CMD check --as-cran 中抛出错误,因此它可能无法通过 CRAN 的自动预测试。

编辑:

按照建议 here 我尝试 if(interactive()){} 而不是 \dontrun{}。此解决方案在 R CMD check --as-crandevtools::check() 中成功,但我认为这不是解决此问题的最合适方法,因为它不能很好地与 example() 一起使用(抛出错误并且不会显示其余示例)。 \dontrun{}example() 一起使用时效果更好,因为它会打印所有示例,但会注释掉用 \dontrun{}.

包裹的示例

我认为包示例不适合 “应该抛出错误消息的示例”

当您将这些 'examples' 移动到 testthat 单元测试时,您的问题将很容易解决。

expect_error()
expect_warning()

查看您的包裹是否按预期抛出 warning/error。

如果你真的想告知用户他们应该避免输入什么,也许你可以将它作为注释添加到示例或其他文档中(详细信息,参数)

您在其他包示例中经常看到的是:

## 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

如果你知道某些东西会抛出错误,你可以将它包装在 try().

## example of failing code
try(stop("Here is an error"))