rm (list = ls ()) не полностью очищает рабочее пространство - PullRequest
32 голосов
/ 21 августа 2010

Это очень незначительная проблема, но я бы хотел точно понять, что здесь происходит.

Скажи, что я делаю следующее:

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)

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

Ответы [ 7 ]

29 голосов
/ 21 августа 2010

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"    
7 голосов
/ 21 августа 2010

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

3 голосов
/ 21 августа 2010

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

2 голосов
/ 11 ноября 2011

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

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

2 голосов
/ 25 августа 2010

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

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

0 голосов
/ 01 октября 2017

если вы работаете с RStudio, вы можете просто перейти к Session-> Clear Workspace ... Чтобы удалить все переменные из вашего рабочего пространства

0 голосов
/ 21 июля 2015

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

rm(list=ls())

или

rm(list=(ls()))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...