Что пути там для очистки среды R от объектов?

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

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

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

Спасибо,

Tal

9
задан Tal Galili 26 May 2010 в 16:15
поделиться

5 ответов

Вы можете попробовать пакет RGtk2 . Вы можете очень легко создать интерфейс с помощью Glade Interface Designer, а затем присоединить к нему любые команды R.

Если вам нужна хорошая отправная точка, где можно «украсть» идеи о том, как использовать RGtk2 , установите пакет rattle и запустите rattle (); . Затем посмотрите исходный код и начните создавать свой собственный интерфейс :)

Я могу попробовать и посмотреть, смогу ли я выйти с чем-нибудь простым.

РЕДАКТИРОВАТЬ: это быстрый и грязный фрагмент кода, с которым можно поиграться. Большая проблема в том, что по какой-то причине инструкция rm не выполняется, но я не уверен, почему ... Я знаю, что это центральная инструкция, но, по крайней мере, интерфейс работает! : D

TODO:

  • Заставить rm работать
  • Я поместил все переменные в среду remObjEnv . Он не должен быть указан в текущей переменной и должен быть удален при закрытии окна
  • В списке будут отображаться только объекты в глобальной среде, все, что находится внутри другой среды, не будет отображаться, но это достаточно легко реализовать
  • , вероятно, есть еще одна ошибка, о которой я не подумал: D

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()
3
ответ дан 4 December 2019 в 07:34
поделиться

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


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

Я обычно делаю что-то подобное третьему варианту. Загрузите мои данные, выполните некоторые проверки, преобразование, скопируйте окончательные данные в глобальную рабочую область и удалите среды.


Вы всегда можете реализовать то, что хотите. Итак

  1. Загрузить данные
    vars <- load ("some_old.RData")
  2. Получить размеры
    vars_size <- sapply (vars, function (x) object.size (get (x)))
  3. Упорядочить
    vars <- vars [порядок (vars_size, уменьшение = ИСТИНА)]
    vars_size <- vars_size [порядок (vars_size, уменьшение = ИСТИНА)]
  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% в% 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))

5
ответ дан 4 December 2019 в 07:34
поделиться

В графическом интерфейсе OS X есть такая штука, она называется обозревателем рабочей области. Очень удобно.

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

1
ответ дан 4 December 2019 в 07:34
поделиться

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

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

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

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

16
ответ дан 4 December 2019 в 07:34
поделиться

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

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
ответ дан 4 December 2019 в 07:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: