Что похоже на #ifdef DEBUG в R?

Я пишу R-код, где бы я хотел, чтобы он запускался либо в режиме "отладки", либо "отладки". В режиме отладки я хотел бы, чтобы код распечатывал информацию о времени выполнения.

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

Например, я могу использовать #ifdef DEBUG (во время компиляции) или установить уровень отладки во время выполнения.

Каким будет эквивалентный способ сделать это в R?

Ответ 1

То же самое, минус препроцессор:

  • Определите глобальную переменную (или используйте значение options())
  • Вставить условный код, который проверяет переменную
  • Работает с вашими функциями (добавление ..., verbose=options(myVerbose)) в ваши пакеты и т.д. pp
  • Я также использовал его в сценариях R (управляемый littler) с использованием пакета CRAN getopt, чтобы выбрать опцию командной строки --verbose или --debug.

Ответ 2

Немного более приятная версия ответа Дирка:

is_debug_mode <- function()
{
  exists(".DEBUG", envir = globalenv()) && 
    get(".DEBUG", envir = globalenv())
}

set_debug_mode <- function(on = FALSE)
{
  old_value <- is.debug.mode()
  .DEBUG <<- on
  invisible(old_value)
}

Использование, например,

if(is_debug_mode())
{
  #do some logging or whatever
}

и

set_debug_mode(TRUE)   #turn debug mode on
set_debug_mode(FALSE)  #turn debug mode off

Ответ 3

Также можно рассмотреть класс Verbose в пакете R.utils, который позволяет очень точно контролировать запуск печати - временная информация разного рода.

Ответ 4

Расширение кода Ричи:

также вы можете проверить переменную системной среды DEBUG для инициализации:

    isdbg <- function()
{
  if(exists(".DEBUG", envir = globalenv()))
  {
    return(get(".DEBUG", envir = globalenv()))
  } else #initialise from shell environment variable
  {
    debugmode <- !(toupper(Sys.getenv("DEBUG")) %in% c("", "FALSE", "0"))
    assign(".DEBUG", debugmode, envir = globalenv())
    return(debugmode)
  }
}

setdbg <- function(on = FALSE)
{
  old_value <- isdbg()
  .DEBUG <<- on
  invisible(old_value)
}

ifdbg <- function(x)
{
    if(isdbg()) x   
}

использование:   setdbg (TRUE) # включить режим отладки   setdbg (FALSE) # отключить режим отладки

if(isdbg())
{
  #do some logging or whatever
}

или

ifdebug(...do something here...)

Ответ 5

Другая возможность - log4r

Чтобы процитировать эту страницу:

log4r: простая система регистрации для R, основанная на log4j

logr4 предоставляет объектно-ориентированную систему ведения журнала, которая использует API примерно эквивалентному log4j и связанным с ним вариантам.