Загрузка пространства имен каретки вызывает случайную функцию?

#r #r-caret

#r #r-каретка

Вопрос:

При загрузке пространства имен для caret пакета я обнаружил следующую ситуацию:

 # 1.
set.seed(1)
print(rnorm(1))           # -0.6264538

# 2. Restart R session

# 3.
set.seed(1)
loadNamespace('caret')
print(rnorm(1))           # -0.3262334

# 4. Restart R session

# 5.
loadNamespace('caret')
set.seed(1)
loadNamespace('caret')
print(rnorm(1))           # -0.6264538
 

Это доставляло мне проблемы, когда я писал коды модульного тестирования для некоторых функций, в которые caret загружается пространство имен. Пример выглядит следующим образом:

Файл R/abn.R :

 abn <- function(){
  requireNamespace('caret')
  round(rnorm(1), 5)
}
 

Файл tests/testthat/test_abn.R :

 context("Test abnomality")

test_that("Anomaly situation", {
  requireNamespace('caret') # Without this line, devtools::check() will fail
                            #   abn() not equal to -0.62645.
                            #   1/1 mismatches
                            #   [1] -0.326 - -0.626 == 0.3
  set.seed(1)
  expect_equal(abn(), -0.62645)
})
 

Вы можете увидеть мое обходное решение.

Я что-то здесь пропустил?

Есть ли надежный способ избежать этой ситуации?

Или это обходное решение может помочь людям в подобных проблемах.

Комментарии:

1. Похоже, это хорошая практика для использования set.seed() . Я не вижу необходимости в «обходном пути».

2. Вы правы. Я могу использовать -0.32623 для модульного тестирования в примере. Но такие действия, как загрузка пространств имен, могут повторяться в коде, и если каретка уже загружена, тест завершится неудачей. Хотя это и не пример, я столкнулся с ситуацией прохождения теста, но сбоя при проверке, и решил эту ситуацию с помощью этого обходного пути. В любом случае, больше всего я не уверен, что нам следует обращать внимание на такой побочный эффект при загрузке пространств имен.

Ответ №1:

Вы действительно ничего не пропустили. Вопрос возникал раньше, и это связано с тем, что некоторые пакеты создают случайные сообщения о запуске. Мне потребовалось некоторое время, чтобы изначально выследить его.

Комментарии:

1. Это помогает. Однако было бы лучше, если бы я что-то пропустил. R world — это фантастика, но использовать R language иногда сложно. Я надеюсь, что разработчики пакетов представят некоторые функции защиты от обратного, которые не позволят программистам создавать труднодоступные ошибки.