6

我正在尝试使用testthat包进行一些单元测试,但我似乎无法让它与rms包一起正常工作。下面的例子:

library(rms)
set.seed(10)
ds <- data.frame(
  ftime = rexp(200),
  fstatus = sample(0:1,200,replace=TRUE),
  x1 = runif(200),
  x2 = runif(200),
  x3 = factor(sample(LETTERS[1:3], size=200, replace=TRUE)))


ddist <- datadist(ds)
options(datadist="ddist")

s <- Surv(ds$ftime, ds$fstatus == 1)
fit <- cph(s ~ x1 + x2 + x3, data=ds)

返回此错误:

设计错误(eval.parent(m)):未找到选项的数据集 ddist(datadist=)

即使 print(ddist) 有效并且 options("datadist") 返回正确的变量,这也是如此。是否testthat有导致错误的不同变量范围?

更新

我通过在我的包目录(Eclipse StatET)中启动的 R 控制台运行测试:

library(testthat)
test_dir("inst/tests")
q()

R CMD check --as-cran 也会出现同样的错误

4

2 回答 2

5

虽然@agstudy 的建议是正确的,但我已经通过使用将变量分配给全局环境的<<-运算符为该错误找到了一个简单的解决方法,这是一个有效的测试文件:

set.seed(10)
n <- 11
ds <- data.frame(
  y = rnorm(n),
  x1 = factor(sample(c("a", "aa", "aaa"), size = n, replace = TRUE)))

suppressMessages(library(rms))
dd <<- datadist(ds)
options(datadist = "dd")

context("rms")
test_that("test", {
  fit <- ols(y ~ x1, data=ds)
  s <- summary(fit)
  expect_true(inherits(s, "summary.rms"))
})

如果您碰巧在以下范围内进行分配,这也有效test_that

context("rms")
test_that("test", {
  set.seed(10)
  n <- 11
  ds <- data.frame(
    y = rnorm(n),
    x1 = factor(sample(c("a", "aa", "aaa"), size = n, replace = TRUE)))

  suppressMessages(library(rms))
  dd <<- datadist(ds)
  options(datadist = "dd")

  fit <- ols(y ~ x1, data=ds)
  s <- summary(fit)
  expect_true(inherits(s, "summary.rms"))
})

这也相当于下面的代码(也许更容易理解):

env <- globalenv() # Grab the global environment
env$dd <- datadist(ds) # Assign the datadist to it

如果您想了解有关环境如何工作的更多信息,我可以推荐 Hadley 对该主题的出色 Advanced R 覆盖。我发现这解释了我遇到的许多问题。

于 2014-08-02T14:50:45.170 回答
2

是的,这是错误提示的范围问题。

一个可能的解决方法是定义ds你打电话的地方test_dir

例如你创建文件,runtest.R像这样

library(rms)
set.seed(10)
ds <- data.frame(
  ftime = rexp(200),
  fstatus = sample(0:1,200,replace=TRUE),
  x1 = runif(200),
  x2 = runif(200),
  x3 = factor(sample(LETTERS[1:3], size=200, replace=TRUE)))
ddist <- datadist(ds)
options(datadist="ddist")
library(testthat)
test_dir("inst/tests")
于 2012-12-30T19:49:15.580 回答