我是R的新手并且正在尝试编写一个函数来搜索所有环境中的对象。
下面的一行很好但是当我将它们包含在'while'循环中时,它们不起作用。我想我在这里遗漏了一些东西。有帮助吗?
name<-10
env=parent.frame()
!identical(env,emptyenv())
exists('name',envir=env,inherits = FALSE)
env<-parent.env(env)
env
MyWhere<-function(name,env=parent.frame){
while(!identical(env,emptyenv())){
if (exists(name,envir=env,inherits = FALSE)) {
env
}
else {
env<-parent.env(env)
}
}
}
MyWhere('a')
错误消息 - 存在错误(name,envir = env,inherits = FALSE): 无效的'envir'参数
答案 0 :(得分:1)
有一个错字:您需要在对parent.frame()的调用中添加括号
MyWhere<-function(name,env=parent.frame()){
如果没有括号,您可以通过&#39;功能&#39;而不是一个环境&#39;对象,导致错误。
答案 1 :(得分:1)
这里有一些问题。您得到的错误是因为您将parent.env
,一个函数而不是parent.env()
作为默认环境值传递给了一个环境。
此外,当您匹配名称时,不会返回环境,这会导致函数匹配时出现无限循环。最后,当函数不匹配时,该函数不会返回空的环境。
当你解决这些问题时,它似乎有效:
MyWhere<-function(name,env=parent.frame()){
while(!identical(env,emptyenv())){
if (exists(name,envir=env,inherits = FALSE)) {
return(env)
} else {
env<-parent.env(env)
}
}
return(env)
}
foo <- 3
MyWhere('foo')
# <environment: R_GlobalEnv>
MyWhere('blah')
# <environment: R_EmptyEnv>
library(ggplot2)
MyWhere('geom_line')
# <environment: package:ggplot2>
# attr(,"name")
# [1] "package:ggplot2"
# attr(,"path")
# [1] "/Library/Frameworks/R.framework/Versions/3.2/Resources/library/ggplot2"