在程序包安装期间执行R脚本

Jor*_*kie 6 r cran install.packages

希望这有一个简单的答案,但我还没有找到它.

我正在编写一个R包,当安装在Windows上时,我希望它执行一个搜索系统文件的脚本,list.files(path = "C:/Program Files/, ...)然后将该路径作为文本文件保存到包目录中供以后参考.

我尝试保存脚本,src/install.libs.R但是阻止了我的包构建.

如果有替代解决方案,我正在尝试保存驻留在程序文件目录(某处!)中的javaw.exe文件的路径,以便我可以通过函数快速调用它system2().

Dir*_*tel 7

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)
}
Run Code Online (Sandbox Code Playgroud)

此文件中的下一步是如何使用它们:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可以运行*post-build*钩子,只需将其作为最后一个R源文件中的最后一个.即如果你没有在`DESCRIPTION`中使用`Collat​​e`,或者如果你在`Collat​​e`中使用了最后一个文件,那就像`zzz.R`.当然,对于二进制包,这将不会运行(甚至包括在内),这些已经构建.所以它有点无用. (2认同)