Rdata
さまざまなオブジェクトを含むファイルがあります。
New.Rdata
|_ Object 1 (e.g. data.frame)
|_ Object 2 (e.g. matrix)
|_...
|_ Object n
もちろん、データフレームをロードすることはできますがload('New.Rdata')
、このファイルから特定のオブジェクトを1つだけロードし、他のオブジェクトを破棄するスマートな方法はありますか?
.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()
ロード先の環境を指定できるので、グローバル ワークスペースなどを汚染する必要はありません。
データ オブジェクトを検索パスにアタッチするのattach
ではなく、 which を使用して、関心のある 1 つのオブジェクトをコピーし、.Rdata オブジェクトをデタッチすることができます。load
これでもすべてが読み込まれますが、すべてをグローバル ワークスペースに読み込み (上書きしたくないものを上書きする可能性があります)、不要なものをすべて削除するよりも作業が簡単です。
サイモン・ウルバネクの答えはとてもとてもいいです。欠点は、保存するオブジェクトが大きすぎると機能しないように見えることです。
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パッケージは、一部の用途の代替手段となる場合があります。