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

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

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

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

.RData файлы не имеют индекса (содержимое сериализуется как один большой парный список). Вы можете взломать способ пройти через список пар и назначить только нужные вам записи, но это непросто, так как вы не можете сделать это на уровне R.

Однако вы можете просто преобразовать файл .RData в базу данных с ленивой загрузкой, которая сериализует каждую запись отдельно и создает индекс. Приятно, что загрузка будет по требованию:

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

Загрузка DB затем загружает только индекс, но не содержимое. Содержимое загружается по мере их использования:

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

Как и при load() вы можете указать среду для загрузки, чтобы не загрязнять глобальное рабочее пространство и т. Д.

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

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

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

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

  • Почему нет classа java.lang.Array? Если java-массив является объектом, не должен ли он расширять Object?
  • Как преобразовать имя переменной (object) в String
  • Управление памятью в Qt?
  • Создание имени переменной с использованием значения String
  • Как перебирать объект JavaScript?
  • В чем разница между переменной, объектом и ссылкой?
  • Проверка наличия вложенного объекта объекта JavaScript
  • sizeof class с int, функцией, виртуальной функцией в C ++?
  • org.hibernate.MappingException: Неизвестный объект: annotations.Users
  • Как отсортировать массив объектов в Java?
  • Как удалить пробелы с правого конца NSString?
  • Давайте будем гением компьютера.