我知道可以使用ls()和rm()查看并删除存在于我的环境中的对象。
但是,当处理“旧”的.RData文件时,有时需要将环境分开以找到要保留和留出的内容。
我想做的是,拥有一个类似GUI的界面,让我能够查看这些对象、排序它们(例如按大小排序),并删除我不需要的对象(例如通过复选框界面)。由于我想象中这样的系统目前尚未在R中实现,那么存在什么方法?您用什么清理旧的.RData文件?
谢谢,
Tal
我知道可以使用ls()和rm()查看并删除存在于我的环境中的对象。
但是,当处理“旧”的.RData文件时,有时需要将环境分开以找到要保留和留出的内容。
我想做的是,拥有一个类似GUI的界面,让我能够查看这些对象、排序它们(例如按大小排序),并删除我不需要的对象(例如通过复选框界面)。由于我想象中这样的系统目前尚未在R中实现,那么存在什么方法?您用什么清理旧的.RData文件?
谢谢,
Tal
我从不创建.RData
文件。如果你正在进行可重现研究(而你应该这样做!),你应该能够使用R文件从输入数据文件到所有输出中进行源控制。
当您有需要较长时间才能完成的操作时,缓存它们是有意义的。我通常会使用类似以下结构:
if (file.exists("cache.rdata")) {
load("cache.rdata")
} else {
# do stuff ...
save(..., file = "cache.rdata")
}
这样可以让你从缓存文件中快速工作,当你需要重新计算时,只需删除工作目录中的所有rdata文件。
基本解决方法是加载您的数据,删除您不需要的内容并保存为新的、干净的数据。
处理这种情况的另一种方式是通过将加载的RData加载到自己的环境中来控制它。
sandbox <- new.env()
load("some_old.RData", sandbox)
ls(sandbox)
sapply(ls(sandbox), function(x) object.size(get(x,sandbox)))
然后你有几种选择:
save(A, B, file="clean.RData", envir=sandbox)
rm(x, z, u, envir=sandbox)
sandbox
我通常会选择类似第三个选项,加载我的数据,进行一些检查和转换,将最终数据复制到全局工作区并删除环境。
你总是可以实现自己想要的。所以
vars <- load("some_old.RData")
vars_size <- sapply(vars, function(x) object.size(get(x)))
vars <- vars[order(vars_size, decreasing=TRUE)]
vars_size <- vars_size [order(vars_size, decreasing=TRUE)]
vars_with_size <- paste(vars,vars_size)
vars_to_save <- select.list(vars_with_size, multiple=TRUE)
rm(vars[!vars_with_size%in%vars_to_save])
为了得到对象大小的美观形式,我使用了基于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")
)))
}
paste(vars, pretty_size(vars_size))
。RGtk2
的想法,安装rattle
包并运行rattle();
。然后查看源代码并开始制作自己的界面:)rm
指令由于某种原因没有被执行,但我不确定为什么...我知道它是中心指令,但至少界面是可以工作的!:Drm
正常工作remObjEnv
环境中。它不应该列在当前变量中,并且在关闭窗口时应该被删除# 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()
一旦您确定了要保留哪些内容,您可以使用gdata包中的-keep-函数实现其名称所示的功能。
a <- 1
b <- 2
library(gdata)
keep(a, all = TRUE, sure = TRUE)
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.
ls()
# spot the rank of the variables you want to remove, for example 10 to 25
rm(list= ls()[[10:25]])
# repeat until satisfied
它没有复选框来删除,而是您选择文件,然后单击删除。但是,下面的解决方案非常容易实现:
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?
})
OS X的GUI确实有这样一个东西,它被称为Workspace Browser。非常方便。
我也希望有一个界面能够显示对象之间的会话依赖关系,即如果我从plot()开始向后工作,找到创建它所使用的所有对象。这需要解析历史记录。
?browseEnv
在任何平台下浏览工作区。ls.str
提供了控制台的替代方案。 - Richie Cotton要清理完整的环境,您可以尝试:
rm(list(ls())