Как я могу аккуратно очистить рабочее пространство R при сохранении определенных объектов?

Предположим, что я возился с некоторыми данными, связывая векторы вместе, поскольку я привык делать в ленивый воскресный день.

    x <- rnorm(25, mean = 65, sd = 10)
    y <- rnorm(25, mean = 75, sd = 7)
    z <- 1:25

    dd <- data.frame(mscore = x, vscore = y, caseid = z)

Теперь у меня есть новый фотокадр dd, который замечательный. Но у меня также есть детрит из моих предыдущих сокращений и комментариев:

    > ls()
    [1] "dd"        "x"          "y"          "z"         

Какой простой способ очистить мое рабочее пространство, если мне больше не нужны мои "исходные" столбцы, но я хочу сохранить фреймворк? То есть, теперь, когда я закончил манипулирование данными, я хотел бы просто иметь dd и ни одну из меньших переменных, которые могут непреднамеренно маскировать дальнейший анализ:

    > ls()
    [1] "dd"

Мне кажется, что решение должно иметь форму rm(ls[ -(dd) ]) или что-то в этом роде, но я не могу понять, как сказать: "Пожалуйста, очистите все, кроме следующих объектов".

Ответ 1

Я бы подошел к этому, создав отдельную среду для хранения всех нежелательных переменных, создав ваш фрейм данных с помощью with(), а затем скопировав те, которые вы хотите сохранить в основной среде. Это имеет то преимущество, что вы аккуратны, но и сохраняете все свои объекты на случай, если вы захотите снова взглянуть на них.

temp <- new.env()
with(temp, {
    x <- rnorm(25, mean = 65, sd = 10) 
    y <- rnorm(25, mean = 75, sd = 7) 
    z <- 1:25 
    dd <- data.frame(mscore = x, vscore = y, caseid = z)
    }
)

dd <- with(temp,dd)

Это дает вам:

> ls()
[1] "dd"   "temp"
> with(temp,ls())
[1] "dd" "x"  "y"  "z" 

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

Ответ 2

Вот подход с использованием setdiff:

rm(list=setdiff(ls(), "dd"))

Ответ 3

Поскольку я забыл, что комментарии не поддерживают полное форматирование, я хотел бы ответить на рекомендацию Хэдли. Некоторые из моего существующего кода - возможно, небрежно - имеют тенденцию работать следующим образом:

    caseid <- 1:25
    height <- rnorm(25, mean = 150, sd = 15)
    hd     <- data.frame(caseid, height)
    hd     <- hd [-(7), ] # Removing a case
    library(ggplot2)
    qplot(x = caseid, y = height, data = hd) # Plots 25 points

В приведенном выше коде qplot() будет отображаться 25 точек, и я думаю, потому что мои глобальные переменные caseid и height маскируют его попытку получить доступ к ним локально из предоставленного фрейма данных. Таким образом, случай, который я удалял, по-видимому, получается построенным, потому что он появляется в глобальных переменных, но не во фрейме hd во время вызова qplot().

Я считаю, что это поведение вполне ожидаемо, и что ответ здесь заключается в том, что я следую субоптимальной практике кодирования. Итак, как я могу начать писать код, который избегает таких непреднамеренных столкновений?