devtoolstest() 有效,但 devtoolscheck() 无效。为什么

ruby

1个回答

写回答

刘大使

2025-06-30 11:05

+ 关注

为什么 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()来运行检查。通过观察测试和检查的结果,我们可以更好地理解它们之间的差异。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号