Я знаю, что могу использовать ls () и комната (), чтобы видеть и удалить объекты, которые существуют в моей среде.
Однако при контакте со "старым".RData файлом, нужно иногда выбирать среду часть для нахождения, что сохранить и что не учесть.
То, что я хотел бы сделать, должно иметь GUI как интерфейс, чтобы позволить мне видеть объекты, сортировать их (например, там размером), и удалить тех мне не нужно (например, интерфейсом флажка). Так как я предполагаю, что такая система в настоящее время не реализуется в R, какие пути действительно существуют? Что Вы используете для очистки старых.RData файлов?
Спасибо,
Tal
Вы можете попробовать пакет RGtk2 . Вы можете очень легко создать интерфейс с помощью Glade Interface Designer, а затем присоединить к нему любые команды R.
Если вам нужна хорошая отправная точка, где можно «украсть» идеи о том, как использовать RGtk2
, установите пакет rattle
и запустите rattle ();
. Затем посмотрите исходный код и начните создавать свой собственный интерфейс :)
Я могу попробовать и посмотреть, смогу ли я выйти с чем-нибудь простым.
РЕДАКТИРОВАТЬ: это быстрый и грязный фрагмент кода, с которым можно поиграться. Большая проблема в том, что по какой-то причине инструкция rm
не выполняется, но я не уверен, почему ... Я знаю, что это центральная инструкция, но, по крайней мере, интерфейс работает! : D
TODO:
rm
работать remObjEnv
. Он не должен быть указан в текущей переменной и должен быть удален при закрытии окна Enjoy
# 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()
Основное решение - загрузить ваши данные, удалить то, что вам не нужно, и сохранить как новые, чистые данные.
Другой способ справиться с этой ситуацией - управлять загруженными 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)
песочницу
Я обычно делаю что-то подобное третьему варианту. Загрузите мои данные, выполните некоторые проверки, преобразование, скопируйте окончательные данные в глобальную рабочую область и удалите среды.
Вы всегда можете реализовать то, что хотите. Итак
vars <- load ("some_old.RData")
vars_size <- sapply (vars, function (x) object.size (get (x)))
vars <- vars [порядок (vars_size, уменьшение = ИСТИНА)]
vars_size <- vars_size [порядок (vars_size, уменьшение = ИСТИНА)]
vars_with_size <- paste (vars, vars_size)
vars_to_save <- select.list (vars_with_size, multiple = TRUE)
rm (vars [! vars_with_size% в% 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")
)))
}
Затем в 4.можно использовать paste (vars, pretty_size (vars_size))
В графическом интерфейсе OS X есть такая штука, она называется обозревателем рабочей области. Очень удобно.
Я также хотел иметь интерфейс, который показывает зависимость сеанса между объектами, т.е. если я начну с plot () и буду работать в обратном направлении, чтобы найти все объекты, которые использовались для его создания. Это потребует анализа истории.
Я никогда не создаю файлы .RData
. Если вы занимаетесь воспроизводимыми исследованиями (а вы должны это делать!), Вы должны иметь возможность использовать источники в файлах R, чтобы переходить от файлов входных данных ко всем выходным данным.
Когда у вас есть операции, которые занимают много времени, имеет смысл кэшировать их. Если вы часто используете такую конструкцию, как:
if (file.exists("cache.rdata")) {
load("cache.rdata")
} else {
# do stuff ...
save(..., file = "cache.rdata")
}
Это позволяет вам быстро работать с кэшированными файлами, а когда вам нужно произвести пересчет с нуля, вы можете просто удалить все файлы rdata в вашем рабочем каталоге.
У него нет флажков для удаления, скорее вы выбираете файл(ы) и нажимаете удалить. Однако, решение, приведенное ниже, довольно легко реализовать:
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?
})