Отключить сохранение трассировки при ошибке

Есть ли способ временно отключить сохранение трассировки при ошибке в R (для сеанса)?

Причина, по которой я спрашиваю, заключается в том, что у ggplot2 есть давняя проблема, которую они не в силах исправить. Каким-то образом весь набор данных сохраняется в трассировке, и если вы работаете с очень большими наборами данных, это означает, что неправильно введенное имя переменной может привести к 10-минутному зависанию.

Особенно, когда я делаю сложные графики для очень больших данных, это наносит вред. Обычно это все небольшие опечатки, мне никогда не нужны трассировки, достаточно только сообщения об ошибке.

Я старался

options(error = expression(NULL))

но, по-видимому, этот обработчик вызывается после сохранения трассировки (зависание сохраняется).

воспроизводимый пример

library(ggplot2)
data(diamonds)
diamonds = diamonds[sample(x=nrow(diamonds),size=200000,replace=T),]
qplot(data=diamonds, wrong, var)

person Ruben    schedule 16.09.2014    source источник
comment
Я не знаю (и буду удивлен, когда кто-нибудь покажет, как это сделать), но здесь применим общий совет при работе с большими данными. Напишите и протестируйте код построения графика с меньшей выборкой данных. И если вы используете функции stat_* для агрегации, попробуйте сделать это вне ggplot2.   -  person Roland    schedule 16.09.2014
comment
@ Роланд Да, но нет. Вот что касается опечаток. Я просто вношу одно изменение в свой код построения, заменяя переменную или около того, и, конечно же, я не использую для этого образец данных, потому что в 9 случаях из 10 я не допущу опечатки. Но да, это может быть невыполнимо. Конечно, исправить эту надоедливую проблему в ggplot было бы еще лучше, но если Хэдли не может этого сделать...   -  person Ruben    schedule 16.09.2014
comment
Интересно, что такое «минимальный воспроизводимый пример» (без использования ggplot2, только базовые команды R)? Не то чтобы он зависал навсегда, а запускал traceback() с данными, которые могли бы быть большими.   -  person Martin Morgan    schedule 16.09.2014
comment
@MartinMorgan Пока не удалось сгенерировать его, но если вы посмотрите ветку комментариев на github, вы увидите, что он появляется только при использовании выражений в кавычках и что трассировка идет к eval через plyr::eval.quoted.   -  person Ruben    schedule 16.09.2014


Ответы (1)


Одна очевидная вещь, о которой я не подумал, — это обернуть вызов в tryCatch, например так:

tryCatch({
    print(qplot(data=diamonds, wrong, var))
}, error = function(e){warning(e)})

Важно напечатать свой график внутри tryCatch, так как в противном случае ошибка возникает после автоматической печати возвращенного объекта графика.

Меня по-прежнему интересовал бы обратный эквивалент options(warn=2) (т. е. вместо того, чтобы превращать предупреждения в ошибки, чтобы их можно было отследить, он превращал бы ошибки в предупреждения, чтобы они не создавали огромную трассировку).

person Ruben    schedule 17.09.2014