История и сохранение всех предупреждений () - PullRequest
4 голосов
/ 24 января 2012

Кажется, есть немного документации по этому поводу (если я не смотрю в неправильном месте!). Я запускаю R в командной строке в Unix:

R --no-save < myfile1.r >& out1.txt

Если у меня одновременно запущено несколько R-сценариев, нужно ли ставить savehistory("history1.Rhistory") и т. Д. В конце каждого файла или можно указать имя файла .Rhistory в аргументах командной строки?

Я также предполагаю, что все предупреждения сохраняются в рабочей области R; тем не менее, видны только последние 50 (There were 50 or more warnings (use warnings() to see the first 50)) - есть ли способ сохранить все предупреждений?

Ответы [ 3 ]

4 голосов
/ 24 января 2012

Я также предполагаю, что все предупреждения сохраняются в рабочем пространстве R

Нет.С ?warnings:

 It is undocumented where ‘last.warning’ is stored nor that it is
 visible, and this is subject to change.  Prior to R 2.4.0 it was
 stored in the workspace, but no longer.

С тех пор он без документов хранится в переменной last.warning в baseenv(), но не полагайтесь на это, чтобы всегда иметь место,(Также обратите внимание, что эта переменная не существует, если еще не было предупреждения.) Вместо этого вы должны получить доступ к последним предупреждениям с помощью warnings().

есть ли способ сохранитьвсе предупреждения?

Не очевидно.Теория состоит в том, что 50 предупреждений - это достаточно поводов для беспокойства одновременно.Прочтите первые 50 и исправьте проблемы или добавьте код ошибки в suppressWarnings, если вы считаете, что предупреждение ошибочное, а затем разберитесь со следующим набором.

3 голосов
/ 24 января 2012

Если вы делаете хотите сохранить все предупреждения, возможно, во внешний файл, вы можете заключить код, который вы выполняете в вызове, в withCallingHandlers(). Это позволяет вам определить «обработчик» для условий предупреждения. Обработчик - это функция, которая запускается каждый раз, когда встречается предупреждение; Вы можете использовать его, чтобы делать практически все, что вы хотите, с помощью предупреждающего сообщения. (Для превосходного краткого введения в эту тему, см. Ответ Мартина Моргана на этот ТАК вопрос .)

Здесь я определяю обработчик, который: (a) добавляет предупреждение в файл; и (b) использует invokeRestart() для продолжения оценки функции в месте, где было выдано предупреждение. Очевидно, вы можете изменить это в соответствии с вашими потребностями:

# DEFINE A WRAPPER FUNCTION THAT:
#    - EVALUATES A GIVEN EXPRESSION
#    - SAVES ALL WARNINGS TO A LOGFILE
saveAllWarnings <- function(expr, logFile="warning_log.R") {
    withCallingHandlers(expr, 
        warning=function(w) {
            cat(conditionMessage(w), "\n\n",  file=logFile, append=TRUE)
            invokeRestart("muffleWarning")
        })
}

# TRY IT OUT WITH A MADE UP FUNCTION THAT THROWS SEVERAL WARNINGS
messyFun <- function() {
    warning("oops")
    warning("boops")
    warning("can't I get anything right?")
    1
}

saveAllWarnings(messyFun(), logFile="messyFun warning log.R")
0 голосов
/ 08 июля 2019

Это сработало для меня.

Из rdocumentation.org:

Обратите внимание, что длина (last.warning) максимально getOption ("nwarnings") (в то время, когдапредупреждения генерируются), который по умолчанию равен 50.Чтобы увеличить, используйте что-то вроде

options(nwarnings = 10000) 

Затем запустите ваш код и вызовите функцию предупреждений.

warnings()

Необходимо запустить эту строку до нарушающий код работает.Запуск исходного кода, изменение количества предупреждений и вызов функции warnings () все равно вернет значение по умолчанию 50.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...