2016-10-13 1 views
0

Dans l'espace de noms de chargement pour le paquet caret, je trouve la situation suivante:Chargement espace de noms caret invoque une fonction aléatoire?

# 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 

Cela m'a donné du mal quand j'écris tests unitaires codes pour certaines fonctions dans lesquelles l'espace de noms caret est chargé. Un exemple est le suivant:

fichier R/abn.R:

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

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

Vous pouvez voir ma solution de contournement.

Quelque chose me manque ici?

Existe-t-il un moyen authentique d'éviter cette situation?

Ou, cette solution de contournement peut aider les personnes ayant des problèmes similaires.

+0

Cela semble être une bonne pratique d'utiliser 'set.seed()'. Je ne vois pas le besoin d'une "solution de contournement". –

+0

Vous avez raison. Je peux utiliser -0.32623 pour les tests unitaires dans l'exemple. Mais des actions telles que le chargement des espaces de noms peuvent être répétées dans le code et si le caret est déjà chargé, le test échouera. Bien que n'étant pas un exemple, j'ai vécu la situation de passer-le-test mais échec-à-vérifier et résolu cette situation avec cette solution de contournement. Quoi qu'il en soit, surtout, je ne suis pas sûr que nous devrions faire attention à ce genre d'effet secondaire lors du chargement des espaces de noms. – skwon

Répondre

1

Vous n'avez vraiment rien manqué. Le question has come up before et il est lié à certains paquets créent des messages de démarrage aléatoires. Il m'a fallu un certain temps pour le retrouver à l'origine.

+0

Cela aide. Cependant, cela aurait été mieux si j'ai raté quelque chose. Le monde de R est fantastique mais l'utilisation du langage R est parfois délicate. J'espère que les développeurs de paquets introduiront des fonctionnalités de protection inverse qui empêcheront les programmeurs de créer des bogues difficiles à trouver. – skwon