[英]How can I use get0 in my R package to search only within package namespace?
假设我的 package 中有一个内部 function,称之为 is_ is_()
,如果is()
可以将其视为更通用的版本。 特别是,它搜索用于判断提供的 object 是否是给定的 class 的专用函数。 例如, is_()
可能被编程为:
is_ <- function(obj, class) {
if (exists(paste0("is.", class))) {
get0(paste0("is.", class))(obj)
}
else inherits(obj, class)
}
这样,如果我在我的 package 中进行参数检查,我可以运行类似
is_(x, "numeric_vector")
我定义的地方
is.numeric_vector <- function(x) is.numeric(x) && is.null(dim(x))
在我的 package 中。
当is.numeric_vector()
在我的 package 之外定义时出现问题,例如,由用户加载的另一个 package 定义。 在这种情况下, exists()
和get0()
都尽可能地找到 function,但我想将搜索限制在我的 ZEFE90A8E604A7C840E88D03A67F6B7 中定义的 function 中(即所有导入的包都包含在我的包中)。 envir
和inherits
arguments 似乎得到了我想要的,但我不知道如何提供它们以获得我想要的结果。 如何将get0()
限制为仅在包的命名空间中搜索其参数?
问题是您的 package 命名空间将从全局环境继承的基本命名空间继承。 有关更详细的说明,请参见此处: https://adv-r.hadley.nz/environments.html#namespaces 。 如果您想更好地控制符号查找,您需要自己完成这项工作。 您可以在 package 中包含您自己的get
function
# These are private helpers that do not need to be exported from your package.
.pkgenv <- environment()
get1 <- function(name, env = .pkgenv) {
if (identical(env, emptyenv())) {
NULL
} else if (identical(env, globalenv())) {
# stop at global env
NULL
} else if (exists(name, envir=env, inherits = FALSE)) {
env[[name]]
} else {
# try parent
get1(name, parent.env(env))
}
}
这将在环境中递归搜索符号,但在全局环境中停止。 您可以将它与您的is_
function 一起使用
is_ <- function(obj, class) {
if (!is.null(fn <- get1(paste0("is.", class)))) {
fn(obj)
} else {
inherits(obj, class)
}
}
这里我们只检查 null 而不是单独验证名称然后检索值。 如果get1
将被称为一堆,您可能需要考虑缓存结果,这样您就不必总是遍历 inheritance 树。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.