Как я могу аккуратно убрать свою рабочую область 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) ]) или что-то, но я не могу вполне выяснить, как сказать, "очистите все КРОМЕ следующих объектов".

11
задан briandk 12 May 2010 в 20:31
поделиться

3 ответа

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

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

10
ответ дан 3 December 2019 в 05:33
поделиться

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

rm(list=setdiff(ls(), "dd"))
11
ответ дан 3 December 2019 в 05:33
поделиться

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

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

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

0
ответ дан 3 December 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: