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.
Es scheint wie gute Praxis, 'set.seed()' zu verwenden. Ich sehe keine Notwendigkeit für einen "Workaround". –
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