изменяемые значения пакета по умолчанию в R - PullRequest
2 голосов
/ 08 сентября 2011

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

Все эти три параметра должны изменяться одновременно для всех функций в стеке вызовов.Например, если я звоню mypackage::function1(profiling = T) и function1, звонит mypackage::function2 и mypackage::function3, я бы хотел, чтобы профилирование было включено для тех, кого это касается.Одним из решений может быть сделать mypackage::turn.on.profiling() и сделать так, чтобы все функции ссылались на некоторую переменную пакета, но это требует хитрости с заблокированными средами и тому подобным.

Другим может быть динамическое определение области действия, моделируемое, хотя sys.frameсемейство функций (то есть, когда профилирование включено, оно включено для чего-либо ниже этой точки в стеке).Не говорите мне, что профилирование в R не работает так, потому что это другой тип профилирования, построенный поверх существующего, но другой.

У меня нет сомнений, что я могу взломать его одинтак или иначе, но мне было интересно, есть ли каноническое решение или, по крайней мере, какой-то прецедент в CRAN для чего-то такого, чтобы я не изобретал колесо.

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Вы можете установить опцию в начале function1 и отменить ее в конце или через on.exit.Что-то вроде:

function1 <- function() {
  op <- options()       # current state of options
  on.exit(options(op))  # restore when function exits
  print(getOption("mypackage.profiling"))
  options(mypackage.profiling=TRUE)  # turn on profiling
  print(getOption("mypackage.profiling"))
}
options(mypackage.profiling=FALSE)
function1()
# [1] FALSE
# [1] TRUE
getOption("mypackage.profiling")
# [1] FALSE

Вы также можете установить параметры при запуске пакета через .onLoad

2 голосов
/ 08 сентября 2011

Другой простой способ - поместить параметры в объект окружения в вашем пакете и изменить его turn.on.profiling -подобную функцию.

# Don't export this 
.profileOptions <- new.env(parent=emptyenv())
.profileOptions$enabled <- FALSE

# export this one
profilingEnabled <- function(flag = NA) {
    oldFlag <- .profileOptions$enabled
    if (!is.na(flag)) {
       .profileOptions$enabled = flag
    }
    oldFlag
}

# then use it
profilingEnabled() # returns TRUE or FALSE
profilingEnabled(TRUE) # enables profiling, returns previous state
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...