我想将
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,但有额外的复杂性
假设您的包裹名为
my.pkg
,您可以这样做:
installing.package <- function () {
Sys.getenv("R_INSTALL_PKG", unset = "") == "my.pkg"
}
该环境变量只会在安装软件包时设置。