1

我正在创建一个具有标准目录层次结构的 R 包。在R目录中,我创建了一个test子目录。

R目录中,我创建了一个uTest.R文件,其中包含:

uTest <- function() {
  test.suite <- defineTestSuite('test',
                               dirs = file.path('R/test'))
  test.result <- runTestSuite(test.suite)
  printTextProtocol(test.result)
}

R/test目录中,我创建了一个runit.test.R文件,其中包含:

test.validDim <- function() {
  testFile <- "test/mat.csv"

  generateDummyData(testFile,
                    10,
                    10)

  checkEquals(validDim(testFile), TRUE)
}

R CMD INSTALL --no-multiarch --with-keep.source RMixtComp我使用Rstudio构建和安装我的包。当我尝试启动该功能uTest()时,我收到以下错误消息:

1 Test Suite : 
test - 1 test function, 1 error, 0 failures
ERROR in test.validDim: Error in func() : could not find function "checkEquals"

但是,如果我在调用library(RUnit)之前调用uTest(),一切正常。在文件的import字段中DESCRIPTION,我添加了RUnit,在NAMESPACE我添加的文件中import(RUnit)

如何uTest()在加载我的包后直接调用,而无需手动加载 RUnit ?

4

1 回答 1

3

您不应该将 RUnit 添加到说明文件中的 Depends(或 Imports)字段(尽管有相反的注释)。这样做意味着需要 RUnit 包才能使用您的包,但情况可能并非如此。换句话说,将 RUnit 放在 Depends 或 Imports 中意味着需要安装 RUnit(Imports)和用户的搜索路径(Depends),以便他们使用您的包。

您应该将 RUnit 添加到说明文件中的 Suggests 字段,然后修改您的uTest函数,如下所示:

uTest <- function() {
  stopifnot(requireNamespace("RUnit"))

  test.suite <- RUnit::defineTestSuite('test', dirs = file.path('R/test'))
  test.result <- RUnit::runTestSuite(test.suite)
  RUnit::printTextProtocol(test.result)
}

这样做允许您使用 RUnit 进行测试,但不需要用户安装 RUnit(并且可能在他们的搜索路径上)才能使用您的包。显然,如果他们希望运行您的测试,他们将需要 RUnit。

于 2015-12-15T05:11:35.037 回答