2016-10-13 37 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