Получить конкретный объект из файла Rdata - PullRequest
47 голосов
/ 02 января 2012

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

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

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

Ответы [ 3 ]

66 голосов
/ 02 января 2012

.RData-файлы не имеют индекса (содержимое сериализуется как один большой pairlist). Вы можете взломать способ пройти через список участников и назначить только записи, которые вам нравятся, но это нелегко, поскольку вы не можете сделать это на уровне 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(), вы можете указать среду для загрузки, чтобы вам не нужно было загрязнять глобальное рабочее пространство и т. Д.

15 голосов
/ 02 января 2012

Вы можете использовать attach вместо load, чтобы прикрепить объект данных к пути поиска, затем вы можете скопировать один интересующий вас объект и отсоединить объект .Rdata.

Это все равно загружает все, но работать проще, чем загружать все в глобальное рабочее пространство (возможно, перезаписывая то, что вы не хотите перезаписывать), а затем избавляться от всего, что вам не нужно.

4 голосов
/ 18 марта 2013

Ответ Саймона Урбанека очень, очень хороший.Недостатком является то, что он не работает, если объект, который будет сохранен, слишком велик:

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

...