2016-03-30 5 views
1

Каков правильный способ автоматического запуска некоторого кода установки (либо в R или C++) после загрузки пакета? В идеале указанный код будет выполняться после того, как пользователь выполнил library(mypackage). Прямо сейчас он содержится в функции setup(), которую нужно запускать один раз перед чем-либо еще.Правильная практика для настройки при загрузке в разработке R-пакета

Просто для более конкретного контекста, в моем конкретном случае, я использую внешнюю библиотеку, которая использует glog, и мне нужно выполнить google::InitGoogleLogging() один раз и только один раз. Это немного неудобно, потому что я пытаюсь использовать его within a library, потому что я должен, хотя он должен быть вызван от main.

ответ

5

Просто прочитайте «Написание R-расширений» и следуйте за выводами - это либо .onAttach(), либо .onLoad(). У меня много пакетов, которые там мало что делают, и не имеет значения, что это вызовы на C++ (через Rcpp или нет), поскольку вы просто спрашиваете, где инициализировать вещи.

Пример:Rblpapi creates a connection and stores it

.pkgenv <- new.env(parent=emptyenv()) 

.onAttach <- function(libname, pkgname) { 
    if (getOption("blpAutoConnect", FALSE)) { 
     con <- blpConnect() 
     if (getOption("blpVerbose", FALSE)) { 
      packageStartupMessage(paste0("Created and stored default connection object ", 
             "for Rblpapi version ", 
             packageDescription("Rblpapi")$Version, ".")) 
     } 
    } else { 
     con <- NULL 
    } 
    assign("con", con, envir=.pkgenv) 
} 

У меня были некоторые (не общественного) код, который установлен на ручку (с помощью C++ код) в собственной базе данных таким же образом. Ключ в том, что эти крючки гарантируют вам исполнение на упаковке load/attach, что вы хотите здесь.

+0

Спасибо. Я искал «настройку» в «Написание R-расширений», которая ничего не появлялась. – user2476581

+0

Я тебя слышу. Эти вещи слишком разбросаны вокруг, но это было частью причины, по которой мы создали список рассылки r-package-devel. Такие темы обсуждаются там, и они имеют хорошее соотношение сигнал/шум. SO работает тоже время от времени :) –