2010-08-21 2 views
29

Это очень незначительная проблема, но я хотел бы точно понять, что здесь происходит.rm (list = ls()) не полностью очищает рабочее пространство

Скажи мне сделать следующее:

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) 

но присоединять дает мне предупреждение о маскирования х и у. Я думал, что я уже скрепил их. Что происходит? Как полностью очистить рабочее пространство? Сам

+5

Одна из многих причин не нам e attach – hadley

ответ

26

attach() не делает копии x и y в вашей глобальной среде, он прикрепляет кадр данных к пути поиска.

От ?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"  
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)?

7

Просто говоря ... если вы, возможно, имеют скрытые объекты в окружающей среде, как .First и .Last функций, вы можете удалите их с помощью rm(list = ls(all.names = TRUE)). Но в вашем случае используйте detach(objectname) для удаления объекта из пути поиска. detach() удалит любой объект в позиции №2, так как .GlobalEnv не может быть удален (и base). С помощью detach() вы можете выгрузить ранее загруженные пакеты, поэтому будьте осторожны (хотя вы всегда можете загрузить их с помощью library(packagename)).

2

Скорее всего у вас есть хотя бы один другой фрейм или список данных, прикрепленный столбцами/компонентами x и y. Вы можете использовать функцию «конфликты», чтобы увидеть все объекты, которые имеют потенциальные конфликты, и использовать функцию «найти», чтобы узнать, где находятся эти объекты (функция «поиск» также помогает, показывая все, что вы приложили).

Ваш вопрос является хорошим примером того, почему привязка фреймов данных насупится, лучше использовать функции типа «с» или «внутри», чтобы у вас не было проблем с забыванием отсоединить объекты.

2

Чтобы использовать функцию detach() для удаления определенного пакета из рабочего пространства, для этого требуется полное описание для пакета.

Пример: Удалить пакет ISwR Ответ 1: отсоединить (ISwR) .... Не работать! Пакет все еще находится на рабочем пространстве. Ответ 2: отсоединить (пакет: ISwR) .... РАБОТАЕТ! Пакет удаляется из рабочего пространства.

-1

Вы можете использовать:

rm(list=ls()) 

или:

rm(list=(ls())) 

но сохранить свое рабочее место, прежде чем закрыть R.

+1

на самом деле не отвечает на вопрос OP ... –

0

, если вы работаете с RStudio, вы можете просто пойти на сессии -> Очистить рабочее пространство ... Очистить все переменные из вашей рабочей области