2015-08-16 6 views
4

Надеюсь, у этого есть прямой ответ, но я пока не смог его найти.Выполнение скриптов R во время установки пакета

Я пишу пакет R, и когда он установлен в Windows, я хочу, чтобы он выполнял скрипт, который ищет системный файл, то есть list.files(path = "C:/Program Files/, ...), а затем сохраняет этот путь в каталог пакета в виде текстового файла для последующей ссылки.

Я попытался сохранить сценарий как src/install.libs.R, но это остановило мой пакет от здания.

В случае, если есть альтернативное решение, я пытаюсь сохранить путь к файлу javaw.exe, который находится в каталоге файлов программы (где-то!), Так что я могу быстро вызов его функций с помощью system2().

ответ

6

Для этого нет крюка в R: выполнение кода во время установки.

Существует, однако, целый набор крючков для загрузки или крепления пакета. Я часто использую для этого .onLoad(). См. , например. как RcppGSL помнит, что линкер и флаг компилятора использовать - от R/inline.R:

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

.onLoad <- function(libname, pkgname) { 

    if (.Platform$OS.type=="windows") { 
     LIB_GSL <- Sys.getenv("LIB_GSL") 
     gsl_cflags <- sprintf("-I%s/include", LIB_GSL) 
     gsl_libs <- sprintf("-L%s/lib -lgsl -lgslcblas", LIB_GSL) 
    } else { 
     gsl_cflags <- system("gsl-config --cflags" , intern = TRUE) 
     gsl_libs <- system("gsl-config --libs" , intern = TRUE) 
    } 

    assign("gsl_cflags", gsl_cflags, envir=.pkgglobalenv) 
    assign("gsl_libs", gsl_libs, envir=.pkgglobalenv) 
} 

Далее в этом файле, как использовать их:

LdFlags <- function(print = TRUE) { 
    if (print) cat(.pkgglobalenv$gsl_libs) else .pkgglobalenv$gsl_libs 
} 

CFlags <- function(print = TRUE) { 
    if (print) cat(.pkgglobalenv$gsl_cflags) else .pkgglobalenv$gsl_cflags 
} 
+0

Вы знаете, если есть планы, чтобы исправить это? Я знаю о ситуациях, когда крюк '.onLoad' не может компенсировать отсутствие крюка после установки, насколько я знаю (моему пакету необходимо установить инструмент командной строки, который сам по себе не является частью пакета). –

+1

Я этого не делал, но я тоже мог использовать крючки во время сборки (например, для вызова 'roxygen()' или 'Rcpp :: compileAttributes()' во время сборки), а также после сборки, скажем, r'). Не уверен, что это когда-нибудь случится. У вас есть более сложный случай, когда вы настаиваете на том, чтобы обходить/избегать системы пакетов, для которой у R Core, возможно, не так много симпатии ... –

+1

Да, я это понимаю. ;-) –