假设我通过将矢量绑定在一起来搞乱一些数据,因为我在一个懒惰的星期天下午不会这样做。
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) ])
或其他形式,但我无法弄清楚如何说“请清理所有内容但是以下内容。”
答案 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个点,我认为这是因为我的全局变量caseid
和height
正在掩盖其尝试从提供的数据帧本地访问它们。因此,我删除的情况似乎仍然被绘制,因为它出现在全局变量中,但不是hd
调用时的数据帧qplot()
。
我的感觉是这种行为是完全可以预料的,而这里的答案是我正在遵循一个次优的编码实践。那么,我怎样才能开始编写避免这种无意碰撞的代码呢?