`高级R`book:查找包含`name绑定的所有环境`
在本书中,练习在`高级R`book:查找包含`name绑定的所有环境`,r,environment-variables,pryr,R,Environment Variables,Pryr,在本书中,练习在环境一章的第10/23页,在迭代与递归一节之后。是的 修改where()以查找包含的绑定的所有环境 名称 这里,where()来自pryr包。首先,为了确保我理解被问到的问题:假设我有名字意思。这可指: > mean function (x, ...) UseMethod("mean") <bytecode: 0x2234b58> <environment: namespace:base> 于是我写道: where2 <- function
环境
一章的第10/23页,在迭代与递归
一节之后。是的
修改where()
以查找包含的绑定的所有环境
名称
这里,where()
来自pryr
包。首先,为了确保我理解被问到的问题:假设我有名字意思。这可指:
> mean
function (x, ...)
UseMethod("mean")
<bytecode: 0x2234b58>
<environment: namespace:base>
于是我写道:
where2 <- function(k, name, env) {
stopifnot(is.character(name), length(name) == 1)
# Why does this only work when calling 'where' from
# the 'pryr' package?
# env <- to_env(env)
# Hopefully the same as 'to_env'.
# env <- as.environment(env)
# Successful case.
if(exists(name, env, inherits=FALSE)) {
k <- list(k, env)
where2(k, name, parent.env(env))
}
# Base case or search one level up.
if(identical(env, emptyenv())) {
stop("Can't find ", name, call.=FALSE)
} else {
where2(k, name, parent.env(env))
}
}
并获取包含基本和全局环境的列表
我应该做些什么以及如何做?此函数解决了以下问题:
where_2 = function (name, env = parent.frame(), env_list = list())
{
stopifnot(is.character(name), length(name) == 1)
env <- as.environment(env)
if (identical(env, emptyenv())) {
if (length(env_list) == 0) {
stop("Can't find ", name, call.=FALSE)
} else {
return(env_list)
}
} else if (exists(name, env, inherits = FALSE)) {
env_list = append(env_list, env)
where_2(name, parent.env(env), env_list = env_list)
}
else {
where_2(name, parent.env(env), env_list = env_list)
}
}
where_2=function(name,env=parent.frame(),env_list=list())
{
stopifnot(是.字符(名称),长度(名称)==1)
env要查找包含名为“mean”的对象的所有环境,您可以使用find(“mean”)
,这将导致[1]”。GlobalEnv“package:base”
where2 <- function(k, name, env) {
stopifnot(is.character(name), length(name) == 1)
# Why does this only work when calling 'where' from
# the 'pryr' package?
# env <- to_env(env)
# Hopefully the same as 'to_env'.
# env <- as.environment(env)
# Successful case.
if(exists(name, env, inherits=FALSE)) {
k <- list(k, env)
where2(k, name, parent.env(env))
}
# Base case or search one level up.
if(identical(env, emptyenv())) {
stop("Can't find ", name, call.=FALSE)
} else {
where2(k, name, parent.env(env))
}
}
> source("./where2.r")
> mean <- 3
> k <- list()
> where2(k, "mean", parent.frame())
Error: Can't find mean
where_2 = function (name, env = parent.frame(), env_list = list())
{
stopifnot(is.character(name), length(name) == 1)
env <- as.environment(env)
if (identical(env, emptyenv())) {
if (length(env_list) == 0) {
stop("Can't find ", name, call.=FALSE)
} else {
return(env_list)
}
} else if (exists(name, env, inherits = FALSE)) {
env_list = append(env_list, env)
where_2(name, parent.env(env), env_list = env_list)
}
else {
where_2(name, parent.env(env), env_list = env_list)
}
}