如何使环境临床清洁?

mra*_*a68 10 r

首先,这个问题有一个类似的标题,但环境似乎只是不洁净.到现在为止,我想到了

rm(list=ls(globalenv()))
Run Code Online (Sandbox Code Playgroud)

我们的全球环境与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())
Run Code Online (Sandbox Code Playgroud)

警告:运行此可重现示例后,您的全局环境将比"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)
> 
Run Code Online (Sandbox Code Playgroud)

至少我现在明白为什么在"rm"的文档中它说明了这一点

rm(list = ls())
Run Code Online (Sandbox Code Playgroud)

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

首先我认为只有"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())
Run Code Online (Sandbox Code Playgroud)

.

> 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
> 
Run Code Online (Sandbox Code Playgroud)

由于这个警告,我想是的

  • R不计算"对象"中的类定义,和
  • "rm"只删除"Objects".

所以似乎"rm"无法删除所有内容.至少删除类定义需要一些额外的工作.这让我感到害怕,除了"rm"和"removeClass"已经完成了他们的遗骸之外,可能还有其他东西,但是对象和类定义仍然隐藏在环境中.

是否有完全清除环境的命令,没有?

小智 1

最好的选择是重新启动 r。我看到经验丰富的 r 程序员推荐它,他们还建议避免 rm(list = ls()) 因为“它使您的脚本容易受到对您运行的事物的隐藏依赖关系”的影响,但在同一过程中。https://www.tidyverse.org/articles/2017/12/workflow-vs-script/