2010-05-26 21 views
8

Tôi biết tôi có thể sử dụng ls() và rm() để xem và loại bỏ các đối tượng tồn tại trong môi trường của tôi.Có những cách nào để làm sạch môi trường R từ các đối tượng?

Tuy nhiên, khi xử lý tệp .RData "cũ", đôi khi cần chọn môi trường một phần để tìm những gì cần giữ và những gì cần bỏ qua. Điều tôi muốn làm là có giao diện GUI giống như cho phép tôi xem các đối tượng, sắp xếp chúng (ví dụ, theo kích thước) và loại bỏ những thứ tôi không cần (ví dụ, bằng giao diện hộp kiểm). Kể từ khi tôi tưởng tượng một hệ thống như vậy hiện không được thực hiện trong R, những cách nào tồn tại? Bạn sử dụng gì để làm sạch các tệp .RData cũ?

Cảm ơn,

Tal

+2

Xem câu hỏi liên quan này http://stackoverflow.com/questions/2822532/how-can-i-neatly-clean-my-r-workspace-while-preserving-certain-objects –

Trả lời

2

Bạn có thể muốn xem gói RGtk2. Bạn có thể dễ dàng tạo giao diện với Trình thiết kế giao diện Glade và sau đó đính kèm bất kỳ lệnh R nào bạn muốn.

Nếu bạn muốn có điểm khởi đầu tốt để "đánh cắp" ý tưởng về cách sử dụng RGtk2, hãy cài đặt gói rattle và chạy rattle();. Sau đó, hãy xem mã nguồn và bắt đầu tạo giao diện của riêng bạn :)

Tôi có thể truy cập vào nó và xem tôi có thể tìm ra điều gì đó đơn giản không.

EDIT: đây là đoạn mã nhanh và bẩn mà bạn có thể chơi cùng. Vấn đề lớn với nó là vì lý do nào đó, lệnh rm không được thực hiện, nhưng tôi không chắc tại sao ... Tôi biết rằng đó là hướng dẫn trung tâm, nhưng ít nhất giao diện hoạt động! : D

TODO:

  • Hãy rm việc
  • tôi đặt tất cả các biến trong môi trường remObjEnv. Nó sẽ không được liệt kê trong biến hiện tại và nó sẽ bị xóa khi cửa sổ đóng
  • Danh sách sẽ chỉ hiển thị các đối tượng trong môi trường toàn cầu, bất kỳ thứ gì bên trong môi trường khác sẽ không được hiển thị, nhưng thật dễ dàng để thực hiện
  • lẽ có một số lỗi khác mà tôi đã không nghĩ đến: D

Thưởng thức

# 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() 
+0

Cảm ơn Nico. Trong trường hợp bạn thành công và chuẩn bị sẵn sàng một cái gì đó - hãy cho tôi biết về nó ([email protected]) Cảm ơn bạn! –

+0

@Tal Galili: Tôi đã cập nhật câu trả lời của mình bằng một đoạn mã. Đó là tất cả cho bạn để chơi với! :) – nico

+0

Hi Nico - tuyệt vời, cảm ơn bạn! Tôi hiện không thể chơi với nó được nêu ra kể từ khi tôi đang gặp vấn đề với Gtk2, nhưng sau khi sửa chữa nó, tôi sẽ cung cấp cho mã của bạn một chạy. Tốt nhất, Tal –

1

OS X gui không có một điều như vậy, nó được gọi là Workspace Browser. Khá tiện dụng.

Tôi cũng muốn một giao diện hiển thị phụ thuộc phiên giữa các đối tượng, tức là nếu tôi bắt đầu từ một ô() và làm việc ngược để tìm tất cả các đối tượng đã được sử dụng để tạo nó. Điều này sẽ yêu cầu phân tích cú pháp lịch sử.

+0

Cảm ơn Ken - có vẻ như một ý tưởng tuyệt vời. Bạn có một đầu mối làm thế nào nó có thể được thực hiện? –

+1

Bạn có thể duyệt vùng làm việc trong bất kỳ nền tảng nào bằng cách sử dụng '? BrowseEnv'. 'ls.str' cung cấp một giao diện điều khiển thay thế. –

+0

Richie - cảm ơn bạn, điều này rất hay (tôi biết ls.str, nhưng không duyệtEnv)! –

15

Tôi chưa bao giờ tạo .RData tệp. Nếu bạn đang thực hành nghiên cứu tái sản xuất (và bạn nên có!), Bạn sẽ có thể nguồn trong các tập tin R để đi từ các tập tin dữ liệu đầu vào cho tất cả các kết quả đầu ra.

Khi bạn có các hoạt động mất nhiều thời gian, bạn nên lưu bộ nhớ cache. Nếu thường xuyên sử dụng một cấu trúc như:

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

Điều này cho phép bạn làm việc một cách nhanh chóng từ các tập tin lưu trữ, và khi bạn cần phải tính toán lại từ đầu, bạn chỉ có thể xóa tất cả các file trong thư mục rdata làm việc của bạn.

+0

Tôi không đồng ý. Mỗi lần tải tất cả các tệp, hợp nhất chúng, hãy chuẩn bị? Tôi chọn chuẩn bị dữ liệu trong ngày, lưu vào .RData và phân tích từ 'tải'. – Marek

+2

Hi Hadley - Về lý thuyết, tôi sẽ lập trường của bạn, trong thực tế nó không phải lúc nào cũng hiệu quả. Ví dụ, tôi có các dự án để đi đến data.frame có liên quan, tôi sẽ cần vài phút xử lý R. Trong trường hợp đó tôi sẽ làm nhiều hơn là làm những gì Marek đã viết. –

+2

Caching hoàn toàn trực giao với thực tiễn làm việc này. Tôi đã thêm ghi chú để làm rõ hơn. – hadley

4

Giải pháp cơ bản là tải dữ liệu của bạn, xóa những gì bạn không muốn và lưu dưới dạng dữ liệu mới, sạch.


Một cách khác để xử lý tình trạng này là để kiểm soát rdata tải bằng cách tải nó sở hữu môi trường

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

Bây giờ bạn có thể nhìn thấy những gì bên trong

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

Sau đó, bạn có một vài posibilities :

  • viết nội dung gì bạn muốn rdata mới: save(A, B, file="clean.RData", envir=sandbox)
  • loại bỏ những gì bạn không muốn từ môi trường rm(x, z, u, envir=sandbox)
  • làm bản sao của biến mà bạn muốn trong không gian làm việc toàn cầu và loại bỏ sandbox

Tôi thường làm điều gì đó tương tự như tùy chọn thứ ba. Tải dữ liệu của tôi, thực hiện một số kiểm tra, chuyển đổi, sao chép dữ liệu cuối cùng sang không gian làm việc chung và xóa môi trường.


Bạn luôn có thể thực hiện những gì bạn muốn.Vì vậy,

  1. tải dữ liệu
    vars <- load("some_old.RData")
  2. Nhận kích thước
    vars_size <- sapply(vars, function(x) object.size(get(x)))
  3. thứ tự họ
    vars <- vars[order(vars_size, decreasing=TRUE)]
    vars_size <- vars_size [order(vars_size, decreasing=TRUE)]
  4. hộp thoại Make (phụ thuộc vào hệ điều hành, đây là Windows)
    vars_with_size <- paste(vars,vars_size)
    vars_to_save <- select.list(vars_with_size, multiple=TRUE)
  5. Hủy bỏ những gì bạn không muốn
    rm(vars[!vars_with_size%in%vars_to_save])

Để hình thức tốt đẹp của kích thước đối tượng tôi sử dụng giải pháp dựa trên 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") 
    ))) 
} 

Sau đó, trong 4. người ta có thể sử dụng paste(vars, pretty_size(vars_size))

+0

Cảm ơn Marek. Mã của bạn hữu ích với một số chức năng và chiến lược thú vị. Tôi hy vọng mặc dù một cái gì đó giống như những gì Nico gợi ý có thể được đưa ra - nó có vẻ dễ dàng hơn để làm việc với. Cảm ơn một lần nữa, Tal. –

1

Nó không có hộp kiểm để xóa với, chứ không phải bạn chọn file (s) sau đó bấm xóa .Tuy nhiên, giải pháp dưới đây là khá dễ thực hiện:

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? 
}) 
+0

Cảm ơn người dùng .___, tôi sẽ thử điều này sau khi RGtk2 của tôi sẽ bắt đầu hoạt động trở lại. Tốt nhất, Tal –

+0

Xin chào một lần nữa, tôi đã thử mã của bạn với các tùy chọn (guiToolkit = "tcltk"), nó đã hoạt động một phần. Tôi có thể thấy bảng các tập tin (tôi thực sự muốn các đối tượng ls(), nhưng đó là tốt) - Nhưng tôi không thấy nút xóa (nó không có đủ không gian). Bất kỳ ý tưởng? –

+0

Vâng, đó là một số lỗi tôi đã không tìm ra cách để sắt ra với các phụ tùng bảng. Một vài hacks nhanh là: bạn có thể thay đổi kích thước cửa sổ theo cách thủ công; di chuyển nút xóa phía trên thể hiện gtable hoặc sử dụng bố cục ngang (bỏ qua ngang = FALSE trong ggroup) --John – jverzani

2

Khi bạn đã tìm ra những gì bạn muốn giữ, bạn có thể sử dụng chức năng -keep- từ gói gdata làm theo tên của nó.

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

Xem trợ giúp (lưu giữ) để biết chi tiết về tùy chọn-và- tùy chọn.

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. 

Chức năng này hữu ích đến nỗi tôi ngạc nhiên không phải là một phần của bản thân R.

Các vấn đề liên quan