2015-08-16 92 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

是的,我意識到這一點。 ;-) –