Pobranie określonego obiektu z pliku Rdata

Mam plik Rdata zawierający różne obiekty:

 New.Rdata
  |_ Object 1  (e.g. data.frame)
  |_ Object 2  (e.g. matrix)
  |_...
  |_ Object n

Oczywiście mogę załadować ramkę danych za pomocą load('New.Rdata'), jednak czy istnieje inteligentny sposób, aby załadować tylko jeden konkretny obiekt z tego pliku i odrzucić inne?

Author: epo3, 2012-01-02

3 answers

.Pliki RData nie posiadają indeksu (zawartość jest serializowana jako jedna duża para). Możesz zhakować sposób, aby przejść przez listę par i przypisać tylko wpisy, które lubisz, ale nie jest to łatwe, ponieważ nie możesz tego zrobić na poziomie R.

Jednak, można po prostu przekonwertować .Plik RData do bazy danych typu lazy-load, która serializuje każdy wpis osobno i tworzy indeks. Najfajniejsze jest to, że ładowanie będzie na żądanie:

# convert .RData -> .rdb/.rdx
e = local({load("New.RData"); environment()})
tools:::makeLazyLoadDB(e, "New")

Ładowanie DB wtedy tylko ładuje indeks ale nie zawartość. Zawartość jest ładowana w trakcie używania:

lazyLoad("New")
ls()
x # if you had x in the New.RData it will be fetched now from New.rdb

Podobnie jak w przypadku load() możesz określić środowisko do załadowania, więc nie musisz zanieczyszczać globalnej przestrzeni roboczej itp.

 61
Author: Simon Urbanek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-02 16:20:24

Możesz użyć attach zamiast load, który dołączy obiekt danych do ścieżki wyszukiwania, a następnie skopiujesz interesujący Cię obiekt i odłączysz go .Obiekt Rdata.

To nadal ładuje wszystko, ale jest prostsze do pracy niż ładowanie wszystkiego do globalnej przestrzeni roboczej (ewentualnie nadpisywanie rzeczy, których nie chcesz nadpisać), a następnie pozbycie się wszystkiego, czego nie chcesz.

 14
Author: Greg Snow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-02 18:02:14

Odpowiedź Szymona Urbanka jest bardzo, bardzo miła. Wadą jest to, że nie wydaje się działać, jeśli obiekt do zapisania jest zbyt duży: {]}

tools:::makeLazyLoadDB(
  local({
    x <- 1:1e+09
   cat("size:", object.size(x) ,"\n")
   environment()
  }), "lazytest")
size: 4e+09 
Error: serialization is too large to store in a raw vector

Zgaduję, że wynika to z ograniczenia obecnej implementacji R (mam 2.15.2), a nie z braku fizycznej pamięci i swapu. Pakiet saves może być alternatywą dla niektórych zastosowań.

 4
Author: Mars,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-18 00:03:30