【问题标题】:Remove objects in .GlobalEnv from within a function从函数中删除 .GlobalEnv 中的对象
【发布时间】:2011-01-29 14:48:37
【问题描述】:

我想创建一个函数 (CleanEnvir),它基本上调用 remove/rm 并从 .GlobalEnv 中删除某些对象。

  CleanEnvir <- function(pattern = "tmp"){
      rm(list = ls()[grep("tmp", ls())], envir = globalenv())
  }

  keep <- 1
  tmp.to.be.removed <- 0
  ls()

  ## does not work
  CleanEnvir()
  ls()

  ## does work
  rm(list = ls()[grep("tmp", ls())], envir = globalenv())
  ls()

【问题讨论】:

    标签: r environment


    【解决方案1】:

    ls() 需要查看正确的位置。默认情况下,它会在当前帧中查找,在您的情况下是函数 CleanEnvir 的帧,因此只能在您的原始帧中找到 "pattern"

    CleanEnvir <- function(pattern = "tmp") {
        objs <- ls(pos = ".GlobalEnv")
        rm(list = objs[grep("tmp", objs)], pos = ".GlobalEnv")
    }
    

    这给出了:

    > CleanEnvir <- function(pattern = "tmp") {
    +     objs <- ls(pos = ".GlobalEnv")
    +     rm(list = objs[grep("tmp", objs)], pos = ".GlobalEnv")
    + }
    > ls()
    [1] "CleanEnvir"        "foo"               "keep"             
    [4] "tmp.to.be.removed"
    > CleanEnvir()
    > ls()
    [1] "CleanEnvir" "foo"        "keep"
    

    【讨论】:

      【解决方案2】:

      您需要在 Global Env 中进行搜索并在那里删除:

      CleanEnvir <- function(pattern = "tmp"){
            rm(list = ls(envir=globalenv())[
                   grep("tmp", ls(envir=globalenv()))], envir = globalenv())
        }
      

      【讨论】:

      • 谢谢!我从不认为 ls() 部分有问题。顺便说一句,grep() 中的第二个 ls() 也需要替换为 ls(envir=globalenv())。
      • 好的。听起来不错,所以添加了,但是当我早些时候测试它时它似乎有效。
      【解决方案3】:

      我为此得到的最短代码解决方案是这个:

      删除特定变量:

      y <- TRUE
      
      CleanEnvir <- function(x) {rm(list=deparse(substitute(x)),envir=.GlobalEnv)}
      
      CleanEnvir(y)
      y
      

      deparse 替换粘贴变量名而不是其值, 确实 pos = ".GlobalEnv" 有效,但您也可以简单地使用 envir=.GlobalEnv

      解决方案 2:这实际上允许模式匹配。 (我强烈建议不要这样做,因为您可能会删除不想意外删除的内容。即,您想删除 tmp1 和 tmp2 但您忘记了还有另一个变量称为 Global.tmp 和 localtmp,如温度例子。

      按模式删除:

      myvar1 <- TRUE
      myvar2 <- FALSE 
      
      Pat.clean.Envir <- function(x) { rm(list = ls(.GlobalEnv)[grep(deparse(substitute(x)), ls(.GlobalEnv))], envir = .GlobalEnv) }
      
      Pat.clean.Envir(myvar)
      

      干杯。

      【讨论】:

      • 这个 is 比其他答案短,但不允许部分匹配 OP 中建议的参数。
      • 好的,我编辑了一个解决方案。但是,用户从未要求在标题或描述性问题中进行模式匹配。只有在他的代码中有一种涉及模式匹配的方法。正如我的回答中所解释的,我强烈建议不要使用部分模式匹配,因为如果你做错了,你会删除错误的变量。偶然用 1 个字母的模式运行它:“a”,80% 的变量都消失了。
      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多