Это очень незначительная проблема, но я хотел бы точно понять, что здесь происходит.
Скажите, что я делаю следующее:
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)
, но приложение дает мне предупреждение о маскировке х и у. Я думал, что я уже забил их. Что происходит? Как мне полностью очистить рабочее пространство?
attach()
не создает копии x
и y
в вашем глобальном окружении, а присоединяет фрейм данных к пути поиска.
From ?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.
For example:
> 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"
Просто упомяну ... если у вас, возможно, есть скрытые объекты в вашей среде, например .First
и .Last
функции, вы можете удалите их с помощью rm (list = ls (all.names = TRUE))
. Но в вашем случае используйте detach (objectname)
, чтобы удалить объект из пути поиска. detach ()
удалит любой объект в позиции № 2, поскольку .GlobalEnv
не может быть удален (и base
тоже). С помощью detach ()
вы можете выгружать ранее загруженные пакеты, поэтому будьте осторожны (хотя вы всегда можете загрузить их с помощью библиотеки (имя пакета)
).
Сам 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())
Обратите внимание на «почти». Есть разные среды.
Вы пробовали отсоединить (values1)
?
Скорее всего, у вас есть хотя бы один другой фрейм данных или список, прикрепленный со столбцами / компонентами x и y. Вы можете использовать функцию «конфликты», чтобы увидеть все объекты, у которых есть потенциальные конфликты, и использовать функцию «найти», чтобы узнать, где находятся эти объекты (функция «поиск» также помогает, показывая все то, что вы прикрепили).
Ваш вопрос является хорошим примером того, почему присоединение фреймов данных не одобряется. Лучше использовать такие функции, как «с» или «внутри», чтобы у вас не было проблем, если вы забыли отсоединить объекты.