功能无法使用R功能

时间:2015-09-01 19:22:45

标签: r

我是R的新手并且正在尝试编写一个函数来搜索所有环境中的对象。

下面的一行很好但是当我将它们包含在'while'循环中时,它们不起作用。我想我在这里遗漏了一些东西。有帮助吗?

    name<-10
    env=parent.frame()
    !identical(env,emptyenv())
    exists('name',envir=env,inherits = FALSE)
    env<-parent.env(env)
    env

while循环中的代码

    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'参数

2 个答案:

答案 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"