#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 иногда сложно. Я надеюсь, что разработчики пакетов представят некоторые функции защиты от обратного, которые не позволят программистам создавать труднодоступные ошибки.