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?
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.
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.
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ń.
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