如何在保留某些对象的同时整洁地清理我的R工作区?

时间:2010-05-12 20:31:27

标签: r statistics

假设我通过将矢量绑定在一起来搞乱一些数据,因为我在一个懒惰的星期天下午不会这样做。

    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 个答案:

答案 0 :(得分:11)

以下是使用setdiff的方法:

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

答案 1 :(得分:9)

我会通过创建一个单独的环境来存储所有垃圾变量,使用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 :(得分:0)

由于我忘记了评论不支持完整格式化,我想在此处回应Hadley的建议。我现有的一些代码 - 也许是草率的 - 倾向于这样工作:

    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个点,我认为这是因为我的全局变量caseidheight正在掩盖其尝试从提供的数据帧本地访问它们。因此,我删除的情况似乎仍然被绘制,因为它出现在全局变量中,但不是hd调用时的数据帧qplot()

我的感觉是这种行为是完全可以预料的,而这里的答案是我正在遵循一个次优的编码实践。那么,我怎样才能开始编写避免这种无意碰撞的代码呢?