Получить определенный объект из файла Rdata
У меня есть файл Rdata
, содержащий различные объекты:
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
Конечно, я могу загрузить фрейм данных с помощью load('New.Rdata')
, однако, есть ли способ загрузить только один конкретный объект из этого файла и отбросить остальные?
Ответы
Ответ 1
. Файлы RData не имеют индекса (содержимое сериализуется как один большой парный список). Вы можете взломать способ пройти через список пар и назначить только нужные вам записи, но это не так просто, потому что вы не можете сделать это на уровне R.
Однако вы можете просто преобразовать файл .RData в базу данных с ленивой загрузкой, которая сериализует каждую запись отдельно и создает индекс. Приятно, что загрузка будет по требованию:
# convert .RData -> .rdb/.rdx
e = local({load("New.RData"); environment()})
tools:::makeLazyLoadDB(e, "New")
Загрузка БД затем загружает только индекс, но не содержимое. Содержимое загружается по мере их использования:
lazyLoad("New")
ls()
x # if you had x in the New.RData it will be fetched now from New.rdb
Как и в случае с load()
, вы можете указать среду для загрузки, так что вам не нужно загрязнять глобальную рабочую область и т.д.
Ответ 2
Вы можете использовать attach
, а не load
, который привяжет объект данных к пути поиска, затем вы можете скопировать один объект, который вас интересует, и отсоединить объект .Rdata.
Это все еще загружает все, но проще работать, чем загружать все в глобальную рабочую область (возможно, перезаписывать вещи, которые вы не хотите перезаписывать), а затем избавляться от всего, чего вы не хотите.
Ответ 3
Симон Урбанек отвечает очень, очень приятно. Недостатком является то, что он не работает, если объект, который нужно сохранить, слишком велик:
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
Я предполагаю, что это связано с ограничением текущей реализации R (я имею 2.15.2), а не заканчивая физической памятью и свопом. Однако saves может быть альтернативой для некоторых видов использования.