Тест, который завершается ошибкой при настройке rms путем вызова datadist() + options()

Я пытаюсь выполнить модульное тестирование с использованием пакета 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 другую область видимости переменных, которая вызывает ошибки?

Обновлять

Я запускаю тест, запущенный консолью R в каталоге моего пакета (Eclipse StatET):

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

Та же ошибка возникает при проверке R CMD --as-cran


person Max Gordon    schedule 30.12.2012    source источник
comment
@agstudy: добавлено, как я запускаю тест, который   -  person Max Gordon    schedule 30.12.2012
comment
‹пожимает плечами› Профессора Харрелл и Уикхэм, как известно, прибегали (или были) к методам программирования, которые могут быть или не быть близкими к методам R Core. Таким образом, могут возникнуть побочные эффекты, длящиеся более четырех часов. Я думаю, вы, возможно, только что встретили одного. Есть два других пакета модульного тестирования, которые вы можете попробовать, если хотите сохранить rms. .   -  person Dirk Eddelbuettel    schedule 30.12.2012
comment
Воспроизвести пока не получается. 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)?   -  person IRTFM    schedule 30.12.2012
comment
@DWin: я использую Windows 7, 64-разрядную версию R 2.15.2, testthat версии 0.7, оценку 0.4.3 и последний пакет rms 3.6-2. R CMD - это просто проверка моего пакета.   -  person Max Gordon    schedule 30.12.2012
comment
@DirkEddelbuettel: мне очень нравятся инструменты, которые входят в пакеты Hmisc/rms, и мой собственный пакет предназначен для дополнения некоторых из них, таких как уценочная альтернатива латексу(). Причина, по которой я настраиваю модульное тестирование, состоит в том, чтобы посмотреть, смогу ли я понять часть кода, реструктурировав Predict(), Predictrms(), контраст() и summary.rms() - все они имеют свой собственный расчет доверительный интервал. Мне это кажется плохой идеей, тем более, что Predict() — единственный, который правильно работает с оценками начальной загрузки (с coef.reps=TRUE).   -  person Max Gordon    schedule 30.12.2012


Ответы (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")
person agstudy    schedule 30.12.2012

Хотя предложение @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

Если вы хотите узнать больше о том, как работают среды, я могу порекомендовать отличный обзор Advanced R от Hadley по теме . Я обнаружил, что это объясняет многие проблемы, с которыми я столкнулся.

person Max Gordon    schedule 02.08.2014