57

Rdataさまざまなオブジェクトを含むファイルがあります。

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

もちろん、データフレームをロードすることはできますがload('New.Rdata')、このファイルから特定のオブジェクトを1つだけロードし、他のオブジェクトを破棄するスマートな方法はありますか?

4

5 に答える 5

77

.RData ファイルにはインデックスがありません (コンテンツは 1 つの大きなペアリストとしてシリアル化されます)。ペアリストを調べて好きなエントリだけを割り当てる方法をハックすることもできますが、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()ロード先の環境を指定できるので、グローバル ワークスペースなどを汚染する必要はありません。

于 2012-01-02T16:20:24.433 に答える
19

データ オブジェクトを検索パスにアタッチするのattachではなく、 which を使用して、関心のある 1 つのオブジェクトをコピーし、.Rdata オブジェクトをデタッチすることができます。load

これでもすべてが読み込まれますが、すべてをグローバル ワークスペースに読み込み (上書きしたくないものを上書きする可能性があります)、不要なものをすべて削除するよりも作業が簡単です。

于 2012-01-02T18:02:14.473 に答える
6

サイモン・ウルバネクの答えはとてもとてもいいです。欠点は、保存するオブジェクトが大きすぎると機能しないように見えることです。

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パッケージは、一部の用途の代替手段となる場合があります。

于 2013-03-18T00:03:30.487 に答える