首先,this question具有相似的标题,但是那里的环境似乎并不干净。
直到现在我还以为

rm(list=ls(globalenv()))

我们拥有一个像第一次启动R时一样干净的全局环境。但是偶然地,我意识到至少类定义仍然存在:
rm(list=ls(globalenv()),envir=globalenv())
sapply(getClasses(globalenv()),function(x){removeClass(x,where=globalenv())})

ls(globalenv())
getClasses(globalenv())

#----------------------------------------------------------------
x <- 1:3
setClass("A", where=globalenv())

ls(globalenv())
getClasses(globalenv())

#----------------------------------------------------------------
rm(list=ls(globalenv()),envir=globalenv())
ls(globalenv())
getClasses(globalenv())

#----------------------------------------------------------------
sapply(getClasses(globalenv()),function(x){removeClass(x,where=globalenv())})
ls(globalenv())
getClasses(globalenv())

警告:运行此可复制示例后,您的全局环境将变为
比在“rm(list = ls())”之后更干净。
> source('~/.active-rstudio-document', echo=TRUE)

> rm(list=ls(globalenv()),envir=globalenv())

> sapply(getClasses(globalenv()),function(x){removeClass(x,where=globalenv())})
named list()

> ls(globalenv())
character(0)

> getClasses(globalenv())
character(0)

> #----------------------------------------------------------------
> x <- 1:3

> setClass("A", where=globalenv())

> ls(globalenv())
[1] "x"

> getClasses(globalenv())
[1] "A"

> #----------------------------------------------------------------
> rm(list=ls(globalenv()),envir=globalenv())

> ls(globalenv())
character(0)

> getClasses(globalenv())
[1] "A"

> #----------------------------------------------------------------
> sapply(getClasses(globalenv()),function(x){removeClass(x,where=globalenv())})
   A
TRUE

> ls(globalenv())
character(0)

> getClasses(globalenv())
character(0)
>

至少我现在知道为什么在“rm”的文档中说
rm(list = ls())

将会删除(几乎)工作环境中的所有内容。

首先,我认为只有“ls”是坏人,因为它不会告诉“rm”类的名称。但是“rm”打折了类名称:
rm(list=ls(globalenv()),envir=globalenv())
sapply(getClasses(globalenv()),function(x){removeClass(x,where=globalenv())})

ls(globalenv())
getClasses(globalenv())

#----------------------------------------------------------------
x <- 1:3
setClass ( "A", where=globalenv() )

ls(globalenv())
getClasses(globalenv())

#----------------------------------------------------------------
rm(list=ls(globalenv()),envir=globalenv())
rm(list=getClasses(globalenv()),envir=globalenv())

ls(globalenv())
getClasses(globalenv())


> source('~/.active-rstudio-document', echo=TRUE)

> rm(list=ls(globalenv()),envir=globalenv())

> sapply(getClasses(globalenv()),function(x){removeClass(x,where=globalenv())})
named list()

> ls(globalenv())
character(0)

> getClasses(globalenv())
character(0)

> #----------------------------------------------------------------
> x <- 1:3

> setClass ( "A", where=globalenv() )

> ls(globalenv())
[1] "x"

> getClasses(globalenv())
[1] "A"

> #----------------------------------------------------------------
> rm(list=ls(globalenv()),envir=globalenv())

> rm(list=getClasses(globalenv()),envir=globalenv())

> ls(globalenv())
character(0)

> getClasses(globalenv())
[1] "A"
Warning message:
In rm(list = getClasses(globalenv()), envir = globalenv()) :
  object 'A' not found
>

由于这个警告,我想
  • R不计算“对象”和
  • 中的类定义
  • “rm”除去“Objects”之外的所有内容。

  • 因此,似乎“rm”无法删除所有内容。至少删除类定义需要一些额外的工作。
    这使我感到害怕,甚至在“rm”和“removeClass”已尽其所能之后,对象和类定义仍可能隐藏在环境中。

    有没有可以完全清除环境的命令,没有禁止任何命令?

    最佳答案

    最好的选择是重新启动r。我见过有经验的r程序员推荐它,他们也建议避免使用rm(list = ls()),因为“它使脚本容易受到对所运行内容的隐藏依赖”,但使用的是同一过程。 https://www.tidyverse.org/articles/2017/12/workflow-vs-script/

    关于r - 如何使临床环境清洁?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32050233/

    10-13 00:06