2016-10-13 3 views
0

В погрузочных именах для 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) 
}) 

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

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

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

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

+0

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

+0

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

ответ

1

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

+0

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

Смежные вопросы