2016-10-13 7 views
0

Im Laden Namensraum für caret Paket, fand ich folgende Situation:Loading Caret-Namespace ruft zufällige Funktion auf?

# 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 

Dies gab mir Mühe, wenn ich Komponententests Codes für einige Funktionen schreiben, in dem die caret Namespace geladen werden. Ein Beispiel hierfür ist wie folgt:

Datei R/abn.R:

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

Datei 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) 
}) 

Sie können meine Umgehungslösung sehen.

Vermisse ich etwas hier?

Gibt es einen authentischen Weg, um diese Situation zu vermeiden?

Oder diese Problemumgehung könnte Personen in ähnlichen Schwierigkeiten helfen.

+0

Es scheint wie gute Praxis, 'set.seed()' zu verwenden. Ich sehe keine Notwendigkeit für einen "Workaround". –

+0

Sie haben Recht. Ich kann -0.32623 für Unit-Tests im Beispiel verwenden. Aktionen wie das Laden von Namespaces können jedoch im Code wiederholt werden. Wenn Caret bereits geladen ist, schlägt der Test fehl. Obwohl nicht exampled, erlebte ich die "Pass-the-Test", aber die "Fail-at-Check" -Situation und löste diese Situation mit dieser Problemumgehung. Jedenfalls bin ich mir nicht sicher, ob wir diese Art von Nebeneffekt beim Laden von Namespaces beachten sollten. – skwon

Antwort

1

Sie haben wirklich nichts verpasst. Die question has come up before und es bezieht sich auf einige Pakete erstellen zufällige Startmeldungen. Es hat eine Weile gedauert, bis ich es gefunden hatte.

+0

Das hilft. Es wäre jedoch besser gewesen, wenn ich etwas verpasst hätte. R Welt ist fantastisch, aber R Sprache ist manchmal schwierig. Ich hoffe, dass Paketentwickler einige gegensätzliche Schutzfunktionen einführen, die verhindern, dass Programmierer schwer zu findende Fehler machen. – skwon