为什么 devtools::test() 有效,但 devtools::check() 无效?
在开发R包的过程中,我们经常需要使用devtools包来进行测试和检查。测试(devtools::test())主要用于验证包中的函数是否按预期工作,而检查(devtools::check())则用于确保包在各个方面都符合CRAN的要求。但有时候我们会遇到这样的情况:测试(devtools::test())可以成功通过,但检查(devtools::check())却失败了。那么,为什么会出现这种情况呢?一种可能的原因是测试和检查的环境不同。测试(devtools::test())是在开发者自己的环境中进行的,而检查(devtools::check())是在一个干净的环境中进行的,以模拟用户使用包的情况。因此,测试通过并不意味着包在任何环境中都能正常工作。检查可能会发现一些在测试中没有出现的问题,比如依赖项的问题、文档的问题等。另一个可能的原因是检查(devtools::check())的标准更高。在进行检查时,CRAN会对包进行更严格的要求,以确保包的质量和可靠性。这可能包括一些细节问题,比如包的命名规范、文件的组织结构等。而这些问题在测试中可能并不会被发现,因为测试主要关注包的功能和正确性。下面我们通过一个案例来具体说明这个问题。假设我们正在开发一个名为"myPackage"的R包,其中包含一个名为"myFunction"的函数。我们先使用devtools::test()来进行测试,代码如下:R# 安装和加载devtools包install.packages("devtools")library(devtools)# 测试myFunction函数test("myFunction")测试通过了,我们可以得到如下结果:? | OK F W S | Context? | 1 | myFunction? | 2 | myFunction? | 3 | myFunction接下来我们使用devtools::check()来进行检查,代码如下:
R# 检查myPackage包check()然而,这次检查却失败了,并给出了如下错误:
Error: Dependencies missing in the package's DESCRIPTION file: 'dplyr'Execution halted我们可以看到,检查发现了一个依赖项的问题:包中的DESCRIPTION文件缺少了'dplyr'包。这个问题在测试中并没有被发现,因为在测试时我们可能已经安装了'dplyr'包,因此函数可以正常运行。但在检查时,CRAN会先尝试安装包的依赖项,如果发现缺少了某些依赖项,就会报错。通过上面的案例,我们可以看到测试和检查之间存在一些差异。测试(devtools::test())主要用于验证包中的函数是否按预期工作,而检查(devtools::check())则用于确保包在各个方面都符合CRAN的要求。测试在开发者的环境中进行,更侧重于功能和正确性,而检查在一个干净的环境中进行,更严格地检查包的质量和可靠性。因此,测试通过不意味着包在任何环境中都能正常工作,而检查可能会发现一些在测试中没有出现的问题。在开发R包时,我们应该养成频繁进行测试和检查的习惯,以确保包的质量和可靠性。测试可以帮助我们验证函数的正确性,而检查可以帮助我们发现并解决一些潜在的问题。只有通过了测试和检查,我们的包才能被认为是健壮和可靠的。参考代码下面是一个示例代码,用于演示测试和检查的差异:
R# 创建一个简单的R包create("myPackage")# 在R包中添加一个函数myFunction <- function(x) {</p> return(x * 2)}# 编写测试脚本testScript <- "</p>test_that('myFunction should double the input', { expect_equal(myFunction(2), 4) expect_equal(myFunction(5), 10)})"# 将测试脚本保存到包的测试文件中testFile <- system.file("tests", "test-myFunction.R", package = "myPackage")</p>write(testScript, file = testFile)# 运行测试devtools::test(package = "myPackage")# 运行检查devtools::check(package = "myPackage")通过上述代码,我们可以先创建一个名为"myPackage"的R包,并在其中添加一个名为"myFunction"的函数。然后,我们编写一个简单的测试脚本,并将其保存到包的测试文件中。最后,我们使用devtools::test()来运行测试,使用devtools::check()来运行检查。通过观察测试和检查的结果,我们可以更好地理解它们之间的差异。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号