Нестабильное поведение traceback () с Rstudio: каждый раз разные выходные данные - PullRequest
8 голосов
/ 05 апреля 2019

Я использую RStudio; У меня есть script1, импортирующий script2 с source; функция в script2 вызывает ошибку. В первый раз, когда это происходит, Rstudio сообщает мне, что скрипт 1 в строке x вызвал ошибку в script2 в строке y. Если я перезапущу его, он только скажет мне об ошибке в script2. Зачем? Это может сделать отладку гораздо более болезненной, чем нужно.

Подробнее:

У меня есть файл myfun.R, который содержит эту функцию (конечно, это просто игрушечный пример):

sum_2_nums <- function(x,y) {
  out <- x + y
  return(out)
}

Затем я импортирую функцию в другой файл, используя source:

source("myfun.R")
mysum <- sum_2_nums(3,"hello")

RStudio установлен на debug -> on error -> error inspector. Когда я запускаю код выше, я вижу:

enter image description here

, который говорит мне, что ошибка в myfun.R, строка 12, была вызвана try_traceback.R, строка 13. Отлично.

Однако, если я снова запускаю скрипт, я получаю:

enter image description here

т.е. ошибка больше не возвращается к try_traceback.R. Мне нужно набрать traceback() в консоли, чтобы увидеть это. Зачем? Различное поведение во второй раз действительно озадачивает меня. Это делает отладку излишне более болезненной, чем она должна быть! Есть ли способ избежать этого?

Примечание Этот вопрос , а не Дубликат Этот : они могут выглядеть аналогично, но ответ на вопрос об использовании echo=TRUE или verbose=TRUE не адрес моей точки зрения об отслеживании ошибки до первого файла .R.

Я видел тот же вопрос здесь , но он остается без ответа.

Редактировать

Для уточнения, в ответ на некоторые комментарии:

  • как я уже сказал, если я нажимаю на Отладка -> на Ошибка -> я вижу, что отмечен флажок «Инспектор ошибок».

  • если я наберу options(error=function()traceback(1)) в консоли, на экране ничего не произойдет, но «Инспектор ошибок» не будет выбран

  • В моем коде больше ничего нет. Это пример с игрушками, на которых я только что показал, и больше ничего. Я не знаю, что еще я могу уточнить - любое руководство будет наиболее ценно.

  • Я очень плохо знаком с R. Я использую Python для анализа данных, но мне любопытно понять, что такое R. Я слышал, что отладка в R намного более громоздка, и хотел попробовать сам. Допустим, я не собираюсь тратить много времени на изучение R, если хотя бы отслеживание такой банальной ошибки настолько проблематично, поэтому я хотел бы понять, что я делаю что-то не так, или отладка и отслеживание всегда это в R

  • когда я говорю «запустить», я имею в виду, что я нажимаю кнопку «источник» в RStudio (кнопка рядом с «запустить»

  • sessionInfo () показывает:

sessionInfo() R version 3.5.3 (2019-03-11) Platform:
x86_64-w64-mingw32/x64 (64-bit) Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale: [1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252    

attached base packages: [1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] compiler_3.5.3 tools_3.5.3    yaml_2.2.0

Edit # 2 (в ответ на ответ Duckmayr)

Давайте, может быть, сделаем шаг назад. В Python я всегда видел довольно подробный след того, что называется, когда возникает ошибка. Например. когда я вижу что-то подобное, я нахожу это очень полезным:

enter image description here

Первый скриншот, который я опубликовал в R studio, очень похож и полезен. Таким образом, мой ожидаемый вывод будет заключаться в получении полного отслеживания каждый раз, когда происходит ошибка.

Почему? Потому что это наиболее полезно для меня; какие могут быть преимущества НЕ показывать его каждый раз? Я не понимаю.

Вместо этого вы говорите, что по замыслу полный возврат не указывается каждый раз? Если так:

  • Почему? Есть ли фундаментальная причина, по которой я скучаю? Есть ли сценарий, в котором это имеет больше смысла, чем то, к чему я привык в Python?
  • Это где-нибудь задокументировано? Я не смог его найти.
  • Есть ли способ получить полную обратную связь каждый раз? Настройка, чтобы изменить? Будет ли выход и открытие RStudio делать?

Да, я понимаю, что всегда могу набрать traceback (), но поведение Python, показывающее полный возврат каждый раз, гораздо удобнее - я искренне не понимаю, каковы преимущества показа traceback только в первый раз.

1 Ответ

1 голос
/ 15 апреля 2019

Мне довольно сложно точно определить, какое поведение вы хотите, чтобы RStudio дал вам, но это может помочь вам, если я опубликую некоторую информацию о том, что ожидается.

  • Полный возврат нев списке каждый раз: по моему опыту, RStudio автоматически распечатывает полный трекбек только при первом выполнении функции в ее текущей форме.Если вы измените свой код, то при следующем вызове также автоматически будет распечатана полная трассировка.Такое поведение может или не может быть автоматически настраивается. Однако, что более важно :
  • Функции R traceback() и debug() всегда доступны для вас, независимо от настроек RStudio!Итак, в первый раз, когда я source ваш сценарий, я вижу:

enter image description here

Тогда, если я source ваш сценарий ни с чемизменилось, я получаю:

> source('~/try_traceback.R')
Error in x + y : non-numeric argument to binary operator

Но это не проблема;Я могу просто запустить:

> traceback()
5: sum_2_nums(3, "hello") at try_traceback.R#2
4: eval(ei, envir)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("~/try_traceback.R")

Я также могу использовать debug(sum_2_nums) для повторного запуска функции с отладкой.

Кроме того, если я изменю sum_2_nums() в myfun.R наследующее:

sum_2_nums <- function(x,y) {
    cat("")
    out <- x + y
    return(out)
}

Я снова вижу

enter image description here

, когда я пытаюсь source ваш сценарий.

Так что вы можете не согласиться, но я не считаю, что отладка в R затруднена, просто запомните функции traceback() и debug(), и все будет в порядке.

...