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)

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

Ответ 1

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

Ответ 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. Вы можете использовать функцию "конфликты", чтобы увидеть все объекты, которые имеют потенциальные конфликты, и использовать функцию "Найти", чтобы узнать, где находятся эти объекты (функция "поиск" также помогает, показывая все, что вы приложили).

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

rm(list=ls())

или

rm(list=(ls()))

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