2012-01-02 7 views
40

ファイルRDATAから特定のオブジェクトを取得します。私はload('New.Rdata')でデータフレームを読み込むことができます。もちろん、私はさまざまなオブジェクトを含む<code>Rdata</code>ファイル持って

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

を、しかし、1つの特定のオブジェクトをロードするスマートな方法がありますこのファイルを削除して他のファイルを破棄しますか?

+1

コメントでは、@DWinはいいえません。 http://stackoverflow.com/questions/6550510/examining-contents-of-rdata-file-by-attaching-into-a-new-environment-posable –

+1

しかし、すべての事柄で - R私はサイモンに延期します。 –

答えて

61

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

+1

しかし、ルックアップは "x"を得るために "New.RData"を介したシリアルアクセスを必要とします。したがって、 "x"が "New.RData"の最後にある場合、時間節約はないでしょうか?質問2:非直列化プロセスが "New.RData"を通って動作するときに遭遇する他のオブジェクトでメモリが占​​有されませんか? –

+1

いいえ、ルックアップは単に 'x'の始めに' New.rdb'を探し、 'x'だけを読み込みます。 –

+8

これらの機能がより少なくなる可能性はありますか? – hadley

10

をあなたはむしろattachを使用することができますデータオブジェクトを検索パスに添付するloadよりも重要なオブジェクトをコピーし、.Rdataオブジェクトをデタッチすることができます。

これはまだすべてを読み込みますが、グローバルワークスペースにすべてを読み込んで(上書きしたくないものを上書きする)、すべてのものを取り除くよりも簡単です。

+3

この答えは良いですが、検索パスから.RDataオブジェクトを切り離すのは直感的ではないため、例を使ってより完全なものになります。 'someFile.RData'から' someObj'を取得する例: 'attach( 'someFile.RData'); someObj < - someObj; detach( 'file:someFile.RData') ' – C8H10N4O2

+0

@ C8H10N4O2、あなたの例は良い(と非常に明示的です)。しかし、デフォルトの位置(2)でアタッチし、detachを呼び出す前に他のものをアタッチしないと、デフォルトが機能し、引数なしで 'detach()'を呼び出すだけでファイルをデタッチします。これはより迅速で簡単です。あなたのアプローチはより安全です。 –

4

Simon Urbanekの答えはとても、とてもいいです。私はこれがRの現在の実装の制限によるものであると推測している

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 

(私は2.15を持っている:欠点は、保存されるオブジェクトが大きすぎると動作するようには思えないということです。 2)物理メモリとスワップが不足しています。ただし、一部の用途では、savesパッケージを使用することもできます。

+1

これは答えではなく拡張されたコメントです。 – C8H10N4O2

関連する問題