rm(list=ls()) 没有完全清除工作区

Posted

技术标签:

【中文标题】rm(list=ls()) 没有完全清除工作区【英文标题】:rm(list=ls()) doesn't completely clear the workspace 【发布时间】:2011-04-01 22:49:51 【问题描述】:

这是一个非常小的问题,但我想确切地了解这里发生了什么。

假设我做了以下事情:

library(Rmysql)
con <- dbConnect(MySQL(), host="some.server.us-east-1.rds.amazonaws.com",user="aUser", password="password", dbname="mydb")

values1 <- dbGetQuery(con,"select x,y from table1")
attach(values1)

此时,我可以做到

rm(list=ls())

values2 <- dbGetQuery("select x,y from table1")
attach(values2)

但附件给了我一个关于屏蔽 x 和 y 的警告。我以为我已经破坏了那些。到底是怎么回事?如何彻底清除工作区?

【问题讨论】:

不使用附加的众多原因之一 【参考方案1】:

attach() 不会在您的全局环境中复制xy,它会将数据框附加到搜索路径。

来自?attach

The database is not actually attached.  Rather, a new environment
 is created on the search path and the elements of a list
 (including columns of a data frame) or objects in a save file or
 an environment are _copied_ into the new environment.  If you use
 ‘<<-’ or ‘assign’ to assign to an attached database, you only
 alter the attached copy, not the original object.  (Normal
 assignment will place a modified version in the user's workspace:
 see the examples.)  For this reason ‘attach’ can lead to
 confusion.

例如:

> search()
[1] ".GlobalEnv"        "package:stats"     "package:graphics" 
[4] "package:grDevices" "package:utils"     "package:datasets" 
[7] "package:methods"   "Autoloads"         "package:base"     
> a <- data.frame(stuff=rnorm(100))
> search()
[1] ".GlobalEnv"        "package:stats"     "package:graphics" 
[4] "package:grDevices" "package:utils"     "package:datasets" 
[7] "package:methods"   "Autoloads"         "package:base"     
> attach(a)
> search()
 [1] ".GlobalEnv"        "a"                 "package:stats"    
 [4] "package:graphics"  "package:grDevices" "package:utils"    
 [7] "package:datasets"  "package:methods"   "Autoloads"        
[10] "package:base"     
> rm(list=ls())
> search()
 [1] ".GlobalEnv"        "a"                 "package:stats"    
 [4] "package:graphics"  "package:grDevices" "package:utils"    
 [7] "package:datasets"  "package:methods"   "Autoloads"        
[10] "package:base"     
> stuff
  [1] -0.91436377  0.67397624  0.62891651 -0.99669584  2.07692590 -0.62702302
  [...]
> detach(a)
> search()
[1] ".GlobalEnv"        "package:stats"     "package:graphics" 
[4] "package:grDevices" "package:utils"     "package:datasets" 
[7] "package:methods"   "Autoloads"         "package:base"    

【讨论】:

有没有办法在修改attach(a)创建的环境后清除它?如果我 attach(a),使用列名作为参考对列进行更改,然后 detach(a) 后跟 attach(a) 不会删除这些更改。【参考方案2】:

顺便提一下...如果您的环境中有隐藏对象,例如.First.Last 函数,您可以使用rm(list = ls(all.names = TRUE)) 删除它们。但在您的情况下,请使用 detach(objectname) 从搜索路径中删除对象。 detach() 将移除位置 #2 中的任何对象,因为无法移除 .GlobalEnv(也无法移除 base)。使用detach(),您可以卸载以前加载的包,所以要小心(尽管您始终可以使用library(packagename) 加载它们)。

【讨论】:

【参考方案3】:

R 本身在rm 的帮助中说:

## remove (almost) everything in the working environment.
## You will get no warning, so don't do this unless you are really sure.
rm(list = ls())

注意“几乎”。有不同的环境。

你试过detach(values1)吗?

【讨论】:

【参考方案4】:

您很可能至少有一个附加了 x 和 y 列/组件的其他数据框或列表。您可以使用“冲突”功能查看所有存在潜在冲突的对象,并使用“查找”功能找出这些对象的位置(“搜索”功能还有助于显示您附加的所有内容)。

您的问题是一个很好的例子,说明为什么附加数据框不受欢迎,最好使用“with”或“within”等函数,这样您就不会因忘记分离对象而遇到问题。

【讨论】:

【参考方案5】:

要使用 detach() 函数从工作空间中删除特定包,它需要包的完整描述。

示例:删除包 ISwR 答案 1: detach(ISwR) .... 不工作!包仍在工作空间中。 答案 2: detach(package:ISwR) .... 工作!包从工作空间中移除。

【讨论】:

【参考方案6】:

如果你正在使用 RStudio,你可以去 Session->Clear Workspace... 清除工作区中的所有变量

【讨论】:

【参考方案7】:

你可以使用:

rm(list=ls())

或:

rm(list=(ls()))

但在关闭 R 之前保存工作区。

【讨论】:

以上是关于rm(list=ls()) 没有完全清除工作区的主要内容,如果未能解决你的问题,请参考以下文章

在 rstudio 中一次性清除工作区和采购脚本

R中的常用命令(持续更新)

R语言rm函数remove函数清除工作空间对象实战

R: 常用操作文件管理函数

R语言常用命令集合

R语言可视化:箱线图绘制