从对象清除R环境有哪些方法?

时间:2010-05-26 16:15:25

标签: r

我知道我可以使用ls()和rm()来查看和删除我环境中存在的对象。

但是,在处理“旧”.RData文件时,有时需要选择一个环境来查找要保留的内容以及要遗漏的内容。

我想做的是,有一个类似GUI的界面,允许我查看对象,对它们进行排序(例如,按大小排序),并删除我不需要的对象(例如,通过一个复选框界面)。既然我认为这样的系统目前还没有在R中实现,那么有哪些方法呢?你用什么来清理旧的.RData文件?

谢谢,

塔尔

8 个答案:

答案 0 :(得分:16)

我从不创建.RData个文件。如果您正在进行可重复的研究(并且您应该!),您应该能够使用R文件来源从输入数据文件到所有输出。

如果您的操作需要很长时间,那么缓存它们是有意义的。如果经常使用像:

这样的结构
 if (file.exists("cache.rdata")) { 
    load("cache.rdata")
 } else {
    # do stuff ...
    save(..., file = "cache.rdata")
 }

这使您可以从缓存文件快速工作,当您需要从头开始重新计算时,您只需删除工作目录中的所有rdata文件。

答案 1 :(得分:5)

基本解决方案是加载您的数据,删除您不想要的内容并保存为新的干净数据。


处理这种情况的另一种方法是通过将加载的RData加载到自己的环境来控制加载的RData

sandbox <- new.env()
load("some_old.RData", sandbox)

现在你可以看到里面的内容了

ls(sandbox)
sapply(ls(sandbox), function(x) object.size(get(x,sandbox)))

然后你有几个可能性:

  • 写下你想要的新RData:save(A, B, file="clean.RData", envir=sandbox)
  • 从环境rm(x, z, u, envir=sandbox)
  • 中删除您不想要的内容
  • 在全局工作区中复制所需的变量并删除sandbox

我通常做类似于第三种选择的事情。加载我的数据,进行一些检查,转换,将最终数据复制到全局工作区并删除环境。


你总能实现你想要的。所以

  1. 加载数据
    vars <- load("some_old.RData")
  2. 获取尺寸
    vars_size <- sapply(vars, function(x) object.size(get(x)))
  3. 订购他们 vars <- vars[order(vars_size, decreasing=TRUE)]
    vars_size <- vars_size [order(vars_size, decreasing=TRUE)]
  4. 制作对话框(取决于操作系统,这里是Windows)
    vars_with_size <- paste(vars,vars_size)
    vars_to_save <- select.list(vars_with_size, multiple=TRUE)
  5. 删除您不想要的内容 rm(vars[!vars_with_size%in%vars_to_save])
  6. 为了很好的对象大小,我使用基于getAnywhere(print.object_size)

    的解决方案
    pretty_size <- function(x) {
        ifelse(x >= 1024^3, paste(round(x/1024^3, 1L), "Gb"),
        ifelse(x >= 1024^2, paste(round(x/1024^2, 1L), "Mb"),
        ifelse(x >= 1024  , paste(round(x/1024, 1L), "Kb"),
                            paste(x, "bytes")
        )))
    }
    

    然后在4.中,可以使用paste(vars, pretty_size(vars_size))

答案 2 :(得分:3)

您可能需要查看RGtk2包。 您可以使用Glade Interface Designer轻松创建界面,然后附加您想要的任何R命令。

如果您想要一个良好的起点来“窃取”关于如何使用RGtk2的想法,请安装rattle包并运行rattle();。然后查看源代码并开始创建自己的界面:)

我可能会去看看,看看我能不能说出简单的东西。

编辑:这是一段快速而又脏的代码,您可以使用它。最大的问题是,无论出于何种原因rm指令都没有被执行,但我不知道为什么......我知道它是中心指令,但至少接口有效! :d

TODO:

  • rm工作
  • 我将所有变量放在remObjEnv环境中。它不应该列在当前变量中,并且应该在窗口关闭时删除它
  • 该列表仅显示全局环境中的对象,其他环境中的任何内容都不会显示,但这很容易实现
  • 可能还有其他一些我没想过的错误:D

享受

# Our environment
remObjEnv <<- new.env()

# Various required libraries
require("RGtk2")

remObjEnv$createModel <- function()
    {
    # create the array of data and fill it in
    remObjEnv$objList <- NULL
    objs <- objects(globalenv())

    for (o in objs)
        remObjEnv$objList[[length(remObjEnv$objList)+1]] <- list(object = o, 
            type = typeof(get(o)),
            size = object.size(get(o)))

    # create list store
    model <- gtkListStoreNew("gchararray", "gchararray", "gint")

    # add items 
    for (i in 1:length(remObjEnv$objList))
        {
        iter <- model$append()$iter

        model$set(iter,
              0, remObjEnv$objList[[i]]$object,
              1, remObjEnv$objList[[i]]$type,
              2, remObjEnv$objList[[i]]$size)
        }

    return(model)
    }

remObjEnv$addColumns <- function(treeview)
    {
    colNames <- c("Name", "Type", "Size (bytes)")

    model <- treeview$getModel()

    for (n in 1:length(colNames))
        {
        renderer <- gtkCellRendererTextNew()
        renderer$setData("column", n-1)
        treeview$insertColumnWithAttributes(-1, colNames[n], renderer, text=n-1)
        }
    }

# Builds the list. 
# I seem to have some problems in correctly build treeviews from glade files
# so we'll just do it by hand :)
remObjEnv$buildTreeView <- function()
    {   
    # create model
    model <- remObjEnv$createModel()
    # create tree view
    remObjEnv$treeview <- gtkTreeViewNewWithModel(model)

    remObjEnv$treeview$setRulesHint(TRUE)
    remObjEnv$treeview$getSelection()$setMode("single")

    remObjEnv$addColumns(remObjEnv$treeview)
    remObjEnv$vbox$packStart(remObjEnv$treeview, TRUE, TRUE, 0)
    }

remObjEnv$delObj <- function(widget, treeview)
    {
    model <- treeview$getModel()
    selection <- treeview$getSelection()
    selected <- selection$getSelected()
    if (selected[[1]])
        {
        iter <- selected$iter
        path <- model$getPath(iter)
            i <- path$getIndices()[[1]]
            model$remove(iter)
        }

    obj <- as.character(remObjEnv$objList[[i+1]]$object)
    rm(obj)
    }

# The list of the current objects
remObjEnv$objList <- NULL

# Create the GUI.
remObjEnv$window <- gtkWindowNew("toplevel", show = FALSE)
gtkWindowSetTitle(remObjEnv$window, "R Object Remover")
gtkWindowSetDefaultSize(remObjEnv$window, 500, 300)
remObjEnv$vbox <- gtkVBoxNew(FALSE, 5)
remObjEnv$window$add(remObjEnv$vbox)

# Build the treeview
remObjEnv$buildTreeView()

remObjEnv$button <- gtkButtonNewWithLabel("Delete selected object")
gSignalConnect(remObjEnv$button, "clicked", remObjEnv$delObj, remObjEnv$treeview)
remObjEnv$vbox$packStart(remObjEnv$button, TRUE, TRUE, 0)

remObjEnv$window$showAll()

答案 3 :(得分:2)

一旦你弄清楚了你想要保留什么,就可以使用函数-keep- from package gdata来做它的名字。

a <- 1
b <- 2
library(gdata)
keep(a, all = TRUE, sure = TRUE)

有关-all-和-sure-选项的详细信息,请参阅help(keep)。

all: whether hidden objects (beginning with a .) should be removed, unless explicitly kept.
sure: whether to perform the removal, otherwise return names of objects that would have been removed.

这个功能非常有用,我很惊讶它不是R本身的一部分。

答案 4 :(得分:1)

OS X gui确实有这样的东西,它叫做工作区浏览器。非常方便。

我还希望有一个界面来显示对象之间的会话依赖关系,即如果我从plot()开始并向后工作以找到用于创建它的所有对象。这需要解析历史记录。

答案 5 :(得分:1)

它没有要删除的复选框,而是选择文件然后单击删除。但是,下面的解决方案很容易实现:

library(gWidgets)
options(guiToolkit="RGtk2")

## make data frame with files
out <- lapply((x <- list.files()), file.info)
out <- do.call("rbind", out)
out <- data.frame(name=x, size=as.integer(out$size), ## more attributes?
                  stringsAsFactors=FALSE)
## set up GUI
w <- gwindow("Browse directory")
g <- ggroup(cont=w, horizontal=FALSE)
tbl <- gtable(out, cont=g, multiple=TRUE)
size(tbl) <- c(400,400)
deleteThem <- gbutton("delete", cont=g)
enabled(deleteThem) <- FALSE
## add handlers
addHandlerClicked(tbl, handler=function(h,...) {
  enabled(deleteThem) <- (length(svalue(h$obj, index=TRUE)) > 0)
})

addHandlerClicked(deleteThem, handler=function(h,...) {
  inds <- svalue(tbl, index=TRUE)
  files <- tbl[inds,1]
  print(files)                          # replace with rm?
})

答案 6 :(得分:1)

可怜的人的答案可能是:

ls()
# spot the rank of the variables you want to remove, for example 10 to 25 
rm(list= ls()[[10:25]])
# repeat until satisfied

答案 7 :(得分:0)

要清洁整个环境,您可以尝试:

rm(list(ls())