2017-04-12 2 views
1

J'essaie d'enregistrer les taux de réussite de la classification de la fonction CAPdiscrim à partir du package BiodiversityR. La vignette pour CAPdiscrim (https://www.rdocumentation.org/packages/BiodiversityR/versions/2.7-2/topics/CAPdiscrim) donne un exemple sur la façon d'obtenir les taux de réussite de classification:Enregistré pour la sortie de boucle est différente de celle dans la console - R

library(BiodiversityR) 
library(vegan) 
library(MASS) 
data(dune) 
data(dune.env) 

for (mseq in 1:14) { 
    CAPdiscrim.result <- CAPdiscrim(dune~Management, data=dune.env, 
     dist="bray", axes=2, m=mseq) 
} 

Cette imprime automatiquement les pourcentages de réussite de classement dans la console par exemple.

Overall classification success: 40 percent 
BF (n=3) correct: 0 percent 
HF (n=5) correct: 40 percent 
NM (n=6) correct: 33.3333333333333 percent 
SF (n=6) correct: 66.6666666666667 percent 

Cependant lorsque vous appelez l'objet CAPdiscrim.result en dehors de la boucle, il produit les résultats réels par exemple CAPdiscrim (str(CAPdiscrim.result)).

List of 14 
$ PCoA  : num [1:20, 1:2] -0.3547 -0.2946 -0.0728 -0.0693 -0.3071 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:20] "1" "2" "3" "4" ... 
    .. ..$ : NULL 
$ m   : int 14 
$ tot   : num 4.3 
$ varm  : num 107 
$ group  : Factor w/ 4 levels "BF","HF","NM",..: 4 1 4 4 2 2 2 2 2 1 ... 
$ CV   : Factor w/ 4 levels "BF","HF","NM",..: 1 2 4 4 3 2 2 1 1 2 ... 
$ percent  : num 40 
$ x   : num [1:20, 1:3] 7.64 0.18 9.43 8.88 -1.93 ... 

etc., etc.

Je sens que j'ai tout essayé de sauver la sortie exacte qui est imprimé dans la console au moment de l'exécution du for loop. J'ai essayé de créer list s vides, vide data.frame s, liant les résultats. Je ne peux juste pas comprendre comment le stocker! Toute aide serait grandement appréciée.

+0

Ce code devrait être reproductible? Oui, je veux juste enregistrer les chaînes. Même s'il est écrasé, je serais en mesure d'obtenir la dernière chaîne seul. Mais ce que j'obtiens est le résultat CAPdiscrim réel, c'est-à-dire l'ensemble de la sortie statistique. –

+0

Désolé, ceci est reproductible. J'ai eu une erreur différente que j'ai mal interprétée. – MrFlick

Répondre

1

Ces chaînes sont en cours d'écriture sur la console via cat() lors de l'appel de fonction. Si vous voulez saisir ces valeurs, utilisez capture.output. Par exemple

myout<-lapply(1:14, function(mseq) { 
    msg <- capture.output(
     CAPdiscrim.result <- CAPdiscrim(dune~Management, data=dune.env, 
     dist="bray", axes=2, m=mseq), 
    type="output") 
    list(msg=msg, result=CAPdiscrim.result) 
}) 

Ceci va capturer les résultats et les chaînes de la liste. Vous pouvez obtenir les chaînes avec

myout[[1]]$msg 

par exemple.

+0

Merci beaucoup, c'est génial. –

1

La boucle for conserve uniquement le dernier CAPdiscrim.result de la valeur mseq, tout en écrasant les 13 premiers résultats de la boucle.

Au lieu de les perdre, utiliser à la place lapply

CAPdiscrim.result <- lapply(1:14, function(mseq){ 
        CAPdiscrim(dune~Management, data=dune.env, 
        dist="bray", axes=2, m=mseq) 
        }) 

Cela va générer une liste de 14 résultats, chacun pour chaque valeur de MSEQ. Si ce qui vous intéresse est la sortie de la console pour le succès de la classification, la manière la plus simple de le faire est de couler la sortie de la console sous forme de fichier texte.

sink("output_text.txt") 
for (mseq in 1:14) { 
     CAPdiscrim.result <- CAPdiscrim(dune~Management, data=dune.env, 
           dist="bray", axes=2, m=mseq) 
     } 
sink() 
+0

Merci beaucoup. J'ai marqué l'autre réponse comme correcte car je peux continuer à manipuler les données dans R de cette façon. Bravo –