检查当前执行是否是软件包安装过程的一部分

问题描述 投票:0回答:1

我想将

my.pkg::f
实现为主动绑定,使用
.GlobalEnv[["x"]]
进行计算。 如果没有
.GlobalEnv[["x"]]
,则应该引发错误。 安装
my.pkg
时,R 似乎会评估
my.pkg::f
,并且由于当前没有
.GlobalEnv[["x"]]
,因此会引发错误并终止安装过程。

我需要一个函数

installing.packages
来检查代码是否作为软件包安装过程的一部分执行。 在这种情况下,我可以让
pkg::f
返回
NULL
,以避免它终止安装。

# ./my.pkg/NAMESPACE: export(f)
# ./my.pkg/R/file.R:

installing.package <- function () {
    ## TODO: check if we are installing the package
    ## a hacky way to check it
    return(length(names(.GlobalEnv)) <= 1) 
}
# to observe the failed install, use:
# installing.package <- function() FALSE

ff <- function() {
    if (!installing.package())
        get("x", globalenv())
}

NAMESPACE <- environment()

.onLoad <- function(libname, pkgname) {
  makeActiveBinding("f", ff, NAMESPACE)
}

注意:这类似于 在包内使用 makeActiveBinding,但有额外的复杂性

r r-package
1个回答
0
投票

假设您的包裹名为

my.pkg
,您可以这样做:

installing.package <- function () {
    Sys.getenv("R_INSTALL_PKG", unset = "") == "my.pkg"
}

该环境变量只会在安装软件包时设置。

© www.soinside.com 2019 - 2024. All rights reserved.