【问题标题】:Testthat fails when setting up rms by calling datadist() + options()通过调用 datadist() + options() 设置 rms 时测试失败
【发布时间】:2012-12-14 23:39:30
【问题描述】:

我正在尝试使用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 也会出现同样的错误

【问题讨论】:

  • @agstudy:添加了我如何运行测试
  • Harrell 和 Wickham 教授都曾(或曾经)使用过可能接近或不接近 R Core 的编程技术。因此,可能会出现持续超过四个小时的副作用。我想你可能刚遇到一个。如果您想保留rms,可以尝试其他两个单元测试包。
  • 目前无法重现。 R 2.15.2、MacOS 10.6.8、R.app GUI 1.53 (6335)、testthat 版本 0.7、evaluate 0.4.2(并使用evaluate 0.4.3 重新测试)。也许是 StatET 劫持了通常的路径有问题?我不知道您所说的相同错误是什么意思:R CMD check --as-cran 这是完整的命令行条目(我输入时出错,但与rms 无关)?
  • @DWin:我使用 Windows 7、R 2.15.2 64 位、testthat v 0.7、评估 0.4.3 和最新的 rms 包 3.6-2。 R CMD 只是对我的包裹进行检查。
  • @DirkEddelbuettel:我真的很喜欢 Hmisc/rms 包中的工具,我自己的包是为了补充其中的一些,比如降价替代 latex()。我设置单元测试的原因是通过重组 Predict()、predictrms()、contrast() 和 summary.rms() 看看我是否能理解一些代码——它们都有自己的计算置信区间。在我看来,这似乎是个坏主意,尤其是因为 Predict() 似乎是唯一能够正确处理自举估计的方法(使用 coef.reps=TRUE)。

标签: r testthat


【解决方案1】:

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

一种可能的解决方法是在您调用test_dir 的位置定义您的ds

例如你创建文件,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")

【讨论】:

    【解决方案2】:

    虽然@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 对 topic 的出色 Advanced R 覆盖。我发现这可以解释我遇到的许多问题。

    【讨论】:

      猜你喜欢
      • 2012-01-12
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2021-06-14
      • 2015-07-08
      • 2014-02-14
      相关资源
      最近更新 更多