web-dev-qa-db-fra.com

Erreur de saut dans la boucle for

Je suis en train de faire une boucle for pour générer 180 graphiques pour ma matrice 6000 X 180 (1 graphique par colonne), certaines données ne correspondent pas à mes critères et le message d'erreur suivant s'affiche:

"Error in cut.default(x, breaks = bigbreak, include.lowest = T) 
'breaks' are not unique". 

Je suis d'accord avec l'erreur, je veux que le programme continue à exécuter la boucle for, et me donne une liste des colonnes qui ont provoqué cette erreur (en tant que variable contenant des noms de colonnes, peut-être?).

Voici ma commande:

for (v in 2:180){
    mypath=file.path("C:", "file1", (paste("graph",names(mydata[columnname]), ".pdf", sep="-")))
    pdf(file=mypath)
    mytitle = paste("anything")
    myplotfunction(mydata[,columnnumber]) ## this function is defined previously in the program
    dev.off()
}

Remarque: j'ai trouvé de nombreux articles sur tryCatch et aucun d'eux ne fonctionnait pour moi (ou du moins, je ne pouvais pas appliquer la fonction correctement). Le fichier d'aide n'a pas été très utile aussi.

Une aide serait appréciée. Merci.

53
Error404

Une façon (sale) de le faire est d'utiliser tryCatch avec une fonction vide pour la gestion des erreurs. Par exemple, le code suivant génère une erreur et rompt la boucle:

for (i in 1:10) {
    print(i)
    if (i==7) stop("Urgh, the iphone is in the blender !")
}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
Erreur : Urgh, the iphone is in the blender !

Mais vous pouvez envelopper vos instructions dans un tryCatch avec une fonction de gestion des erreurs qui ne fait rien, par exemple:

for (i in 1:10) {
  tryCatch({
    print(i)
    if (i==7) stop("Urgh, the iphone is in the blender !")
  }, error=function(e){})
}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

Mais je pense que vous devriez au moins imprimer le message d'erreur pour savoir si quelque chose de grave s'est passé en laissant votre code continuer à s'exécuter:

for (i in 1:10) {
  tryCatch({
    print(i)
    if (i==7) stop("Urgh, the iphone is in the blender !")
  }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
ERROR : Urgh, the iphone is in the blender ! 
[1] 8
[1] 9
[1] 10

EDIT: Donc, appliquer tryCatch dans votre cas serait quelque chose comme:

for (v in 2:180){
    tryCatch({
        mypath=file.path("C:", "file1", (paste("graph",names(mydata[columnname]), ".pdf", sep="-")))
        pdf(file=mypath)
        mytitle = paste("anything")
        myplotfunction(mydata[,columnnumber]) ## this function is defined previously in the program
        dev.off()
    }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
}
103
juba

Au lieu de détecter l'erreur, ne serait-il pas possible de tester d'abord ou avant la fonction myplotfunction() si l'erreur se produira (c'est-à-dire si les coupures sont uniques) et de la tracer uniquement dans les cas où elle a été gagnée n'apparaît pas?

3
Daniel Fischer