如何使环境临床清洁?

时间:2015-08-17 12:19:05

标签: r

首先,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())

警告:运行此可重现的示例后,您的全局环境将是 更清洁而不是&#34; rm(list = ls())&#34;。

> 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)
> 

至少我现在明白为什么在&#34; rm&#34;它说那个

rm(list = ls())

将删除 (差不多) 工作环境中的所有内容。

首先我认为只有&#34; ls&#34;是坏人,因为它没有告诉&#34; rm&#34;类的名称。但是&#34; rm&#34;给班级打折:

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不计算&#34; Objects&#34;和
  • 中的类定义
  • &#34; RM&amp;#34;除了&#34;对象&#34;。
  • 之外什么都不删除

所以似乎&#34; rm&#34;无法删除所有内容。至少删除类定义需要一些额外的工作。 这让我感到害怕,除了对象和类定义仍然隐藏在环境中之外,可能还有其他东西,即使在&#34; rm&#34;和&#34; removeClass&#34;他们做了最大的事。

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

1 个答案:

答案 0 :(得分:1)

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