Пропускать ошибку в для петли

Я делаю для петли для создания 180 графов для мой 6000 X 180 матриц (1 граф для каждого столбца), некоторые данные не соответствуют моим критериям, и я получаю ошибку:

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

Хорошо с ошибкой, я хочу, чтобы программа продолжила бежала за петлей и давала мне список того, какие колонки совершили эту ошибку (как переменное, содержащее имена столбцов, возможно?).

Вот моя команда:

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

Примечание: Я нашел многочисленные сообщения о tryCatch, и ни один из них не работал на меня (или по крайней мере я не мог применить функцию правильно). Справочный файл не был очень полезен также.

Помощь ценилась бы. Спасибо.

40
nl ja de
Хорошо, таким образом, необходимо "практиковать" использование tryCatch. It' s действительно не настолько трудно. Составьте некоторую функцию простого цикла и накормите ее неправильными данными. Тогда обратитесь к своей текущей петле, которая, в конце концов, содержит очень простой набор команд.
добавлено автор Carl Witthoft, источник
Я определенно должен, теперь, когда я знаю, как это работает, я могу играть вокруг с ним.:)
добавлено автор Error404, источник
Займите минуту, чтобы думать о вашем вопросе. Мы должны знать о векторе mypath или факт, который вы экономите pdfs?
добавлено автор csgillespie, источник

2 ответы

Один (грязный) способ сделать это состоит в том, чтобы использовать tryCatch с пустой функцией для обработки ошибок. Например, следующий код поднимает ошибку и ломает петлю:

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 !

Но можно обернуть инструкции в tryCatch с функцией обработки ошибок, которая ничего не делает, например:

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

Но я думаю, что необходимо, по крайней мере, напечатать сообщение об ошибке, чтобы знать, произошло ли что-то плохо, позволяя коду продолжить бежать:

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 : So to apply tryCatch in your case would be something like :

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")})
}
75
добавлено
Спасибо за ваш ответ Джуба команда, которую вы написали, довольно ясна. Но у меня все еще есть 2 проблемы с этим. 1 - К сожалению, программа останавливается в колонке 26 и говорит мне "ОШИБКУ: Urgh, iPhone находится в блендере" (таким образом, ваша программа частично работает!). 2-в вашей команде, ошибка всегда происходит во мне == 7, но у меня могли бы быть ошибки по телефону 26 50 70 120 121 135.... Есть ли способ сказать "Каждый раз, когда есть ошибка, перейдите к следующему если". Ценивший
добавлено автор Error404, источник
Хорошо я доверяю тому, что вы говорите Джубу, ваша команда довольно хороша. но here' s, что произошло (смотрят в конце почты, пожалуйста). Можно ли думать о чем-нибудь идущем не так, как надо?
добавлено автор Error404, источник
Вы сэр, сделанный моим днем! Большое спасибо, это работает отлично!
добавлено автор Error404, источник
tryCatch инструкция должна "перехватить" ошибку каждый раз, когда это происходит в вашем коде или ваших данных...
добавлено автор juba, источник
Нет, вы didn' t понимают, как tryCatch работает. См. мой отредактированный ответ для способа, которым можно использовать его в коде (не проверенный, очевидно). Но Дэниел Fischer' s ответ является, вероятно, лучшим: необходимо действительно попытаться понять то, что ошибка, и заботьтесь о ней в функции.
добавлено автор juba, источник

Вместо того, чтобы фиксировать ошибку, не было бы возможно проверить в или перед myplotfunction() функция сначала, если ошибка произойдет (т.е. если разрывы уникальны), и только подготовьте его для тех случаев, где это не появится?!

3
добавлено
программа прекращает работать в петле 26, that' s, почему я can' t знают, какие колонки создадут эти неприятности снова.
добавлено автор Error404, источник