Подтвердить что ты не робот

Получить определенный объект из файла Rdata

У меня есть файл Rdata, содержащий различные объекты:

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

Конечно, я могу загрузить фрейм данных с помощью load('New.Rdata'), однако, есть ли способ загрузить только один конкретный объект из этого файла и отбросить остальные?

4b9b3361

Ответ 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 может быть альтернативой для некоторых видов использования.