Какие существуют способы очистки окружающей среды от объектов? - PullRequest
9 голосов
/ 26 мая 2010

Я знаю, что могу использовать ls () и rm () для просмотра и удаления объектов, существующих в моей среде.

Однако, когда имеешь дело со «старым» файлом .RData, иногда нужно выбрать часть среды, чтобы найти, что сохранить и что оставить.

То, что я хотел бы сделать, - это иметь интерфейс, подобный GUI, чтобы позволить мне видеть объекты, сортировать их (например, по размеру) и удалять те, которые мне не нужны (например, по интерфейс флажка). Поскольку я полагаю, что такая система в настоящее время не реализована в R, какие способы существуют? Что вы используете для очистки старых файлов .RData?

Спасибо

Tal

Ответы [ 8 ]

16 голосов
/ 27 мая 2010

Я никогда не создаю .RData файлов. Если вы практикуете воспроизводимые исследования (и вы должны это делать!), Вы должны иметь возможность получать исходные данные в файлах R для перехода от файлов входных данных ко всем выходам.

Если у вас есть операции, которые занимают много времени, имеет смысл их кешировать. Если вы часто используете такую ​​конструкцию, как:

 if (file.exists("cache.rdata")) { 
    load("cache.rdata")
 } else {
    # do stuff ...
    save(..., file = "cache.rdata")
 }

Это позволяет вам быстро работать с кэшированными файлами, а когда вам нужно пересчитать с нуля, вы можете просто удалить все файлы rdata в вашем рабочем каталоге.

5 голосов
/ 27 мая 2010

Основное решение - загрузить данные, удалить ненужные и сохранить как новые, чистые данные.


Еще один способ справиться с этой ситуацией - управлять загруженными 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])

Для правильной формы размера объекта я использую решение на основе 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))

3 голосов
/ 27 мая 2010

Вы можете проверить пакет 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()
2 голосов
/ 21 марта 2013

Как только вы выяснили, что вы хотите сохранить, вы можете использовать функцию -keep- из пакета gdata, которая делает то, что предлагает его название.

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

Подробнее об опциях -all- и -sure- см. Справку (сохранить).

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.

1 голос
/ 14 ноября 2018

Бедняга может ответить:

ls()
# spot the rank of the variables you want to remove, for example 10 to 25 
rm(list= ls()[[10:25]])
# repeat until satisfied
1 голос
/ 28 мая 2010

У него нет флажков для удаления, вместо этого вы выбираете файл (ы) и затем нажимаете «Удалить». Однако решение, представленное ниже, довольно просто реализовать:

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?
})
1 голос
/ 26 мая 2010

В OS X gui есть такая вещь, она называется Workspace Browser. Довольно удобно.

Я также хотел иметь интерфейс, который показывает зависимость сеанса между объектами, то есть, если я начинаю с plot () и работаю в обратном направлении, чтобы найти все объекты, которые использовались для его создания. Это потребует анализа истории.

0 голосов
/ 20 марта 2019

Чтобы очистить всю среду, вы можете попробовать:

rm(list(ls())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...