在包安装期间执行R脚本
希望这有一个直截了当的答案,但我还没有找到它 我正在编写一个R软件包,当安装在Windows上时,我希望它执行一个脚本,搜索系统文件,即在包安装期间执行R脚本,r,cran,install.packages,R,Cran,Install.packages,希望这有一个直截了当的答案,但我还没有找到它 我正在编写一个R软件包,当安装在Windows上时,我希望它执行一个脚本,搜索系统文件,即list.files(path=“C:/Program files/,…),然后将该路径保存到软件包目录中作为文本文件供以后参考 我尝试将脚本保存为src/install.libs.R,但这阻止了我的包的生成 如果有另一种解决方案,我将尝试保存驻留在Program files目录(某处!)中的javaw.exe文件的路径,这样我就可以通过system2()在函数
list.files(path=“C:/Program files/,…)
,然后将该路径保存到软件包目录中作为文本文件供以后参考
我尝试将脚本保存为src/install.libs.R
,但这阻止了我的包的生成
如果有另一种解决方案,我将尝试保存驻留在Program files目录(某处!)中的javaw.exe文件的路径,这样我就可以通过
system2()
在函数中快速调用它:在安装过程中执行代码
然而,有一整套用于包加载或附件的钩子。我经常使用.onLoad()
来实现这一点。例如,请参见如何记住要使用的链接器和编译器标志--fromR/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)
}
.pkgglobalenv我没有,但我也可以在构建期间使用钩子(例如在构建期间调用roxygen()
,或Rcpp::compileAttributes()
)以及在构建之后,比如说,安装r
)。不确定它是否会发生。如果你坚持规避/避免r Core可能没有那么多同情心的包系统,你就有更难的理由了……是的,我意识到。;-)在工作中,我们用几个包发送一些脚本,我们可以在那里使用钩子big时间。我们发现最好的是一个从/usr/local/bin
到安装包的scripts/
目录的一次性软链接。当链接目标刷新时,我们必须为每个脚本只执行一次。这仍然是一个难题,但每个脚本和机器至少只能执行一次。请注意,您可以运行一个构建后挂钩,只需将其作为最后一个R源文件中的最后一个文件。例如,如果未在说明中使用Collate
,则类似于zzz.R
,如果未在DESCRIPTION
中使用,Collate
中使用,则作为最后一个文件。当然,这将不会运行(甚至包括在内)对于二进制软件包来说,这些都是已经构建好的。所以它有点无用。不错。还有configure
的预构建钩子,它可以是自由形式的(只要它是模式0755)。我也承认这里的“没用”;-)
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
}