Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在包安装期间执行R脚本_R_Cran_Install.packages - Fatal编程技术网

在包安装期间执行R脚本

在包安装期间执行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()在函数

希望这有一个直截了当的答案,但我还没有找到它

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

我尝试将脚本保存为
src/install.libs.R
,但这阻止了我的包的生成


如果有另一种解决方案,我将尝试保存驻留在Program files目录(某处!)中的javaw.exe文件的路径,这样我就可以通过
system2()
在函数中快速调用它:在安装过程中执行代码

然而,有一整套用于包加载或附件的钩子。我经常使用
.onLoad()
来实现这一点。例如,请参见如何记住要使用的链接器和编译器标志--from
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)
}

.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
}