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

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

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

Ответы [ 3 ]

11 голосов
/ 13 мая 2010

Вот подход, использующий setdiff:

rm(list=setdiff(ls(), "dd"))
9 голосов
/ 13 мая 2010

Я бы подошел к этому, создав отдельную среду для хранения всех нежелательных переменных, сделав фрейм данных с помощью 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" 

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

0 голосов
/ 13 мая 2010

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

    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().

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

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