リストと「サブリスト」をRで保存しているときに、現在奇妙な問題に直面しています。タイトルは明示的ではないかもしれませんが、私を悩ませているのは次のとおりです。
いくつかのデータが与えられた場合 (ここではデータは完全に人為的ですが、問題はモデルの関連性ではありません):
set.seed(1)
a0 = rnorm(10000,10,2)
b1 = rnorm(10000,10,2)
b2 = rnorm(10000,10,2)
b3 = rnorm(10000,10,2)
data = data.frame(a0,b1,b2,b3)
そして、複雑なオブジェクト(オブジェクトとしましょうlm()
)のリストを返す関数:
test = function(k){
tt = vector('list',k)
for(i in 1:k) tt[[i]] = lm(a0~b1+b2+b3,data = data)
tt
}
テスト関数はオブジェクトのリストを返しlm()
ます。このオブジェクトのサイズを見てみましょう:
ok = test(2)
object.size(ok)
> object.size(ok)
4019336 bytes
ok2
関数内ではなく、まったく同じオブジェクトであるを作成しましょう。
ok2 = vector('list',2)
ok2[[1]] = lm(a0~b1+b2+b3,data = data)
ok2[[2]] = lm(a0~b1+b2+b3,data = data)
...そして彼のサイズを確認してください:
> object.size(ok2)
4019336 bytes
ここにあり、ok
まったくok2
同じであるため、R.問題がわかりました。これらのオブジェクトをハード ドライブに R オブジェクトとして保存すると (save()
またはを使用saveRDS()
) :
save(ok,file='ok.RData')
save(ok2,file='ok2.RData')
ハード ドライブ上のサイズはそれぞれ :3 366 005 bytes
と1 678 851 bytes
です。
は、まったく同じなok
のに 2 倍の大きさです。ok2
さらに奇妙なことに、オブジェクトの「サブリスト」を保存するとok[[1]]
、 and ok2[[1]]
(オブジェクトは再び完全に同一です) としましょう:
a = ok[[1]]
a2 = ok2[[1]]
save(a,file='console/a.RData')
save(a2,file='console/a2.RData')
それぞれのハード ドライブ上のサイズ:2 523 284 bytes
と838 977 bytes
.
2 つのこと: のサイズがハード ドライブa
のサイズと異なるのはなぜですか? のサイズがハード ドライブ上の のサイズと異なるa2
のはなぜですか? そして、 HDでは サイズが正確に半分になるのはなぜですか?ok
ok2
a
ok
2 523 284 bytes
ok
3 366 005 bytes
何か不足していますか?
ps : R 2.15.1、2.15.2、2.15.3、3.0.0、および debian と R 2.15.1、R 2.15.2 を使用して、Windows 7 32 ビットでこのテストを実行しました。私は毎回この問題を抱えています。
編集
@ user1609452へのthx、これはうまくいっているように見える小さなトリックです:
test2 = function(k){
tt = vector('list',k)
for(i in 1:k){
tt[[i]] = lm(a0~b1+b2+b3,data = data)
attr(tt[[i]]$terms,".Environment") = .GlobalEnv
attr(attr(tt[[i]]$model,"terms"),".Environment") = .GlobalEnv
}
tt
}
数式オブジェクトには、独自の環境とその中に多くのものがあります。NULL
それを .GlobalEnv に入れると、うまくいっているようです。predict.lm() などの関数は引き続き機能し、保存されたオブジェクトは HD 上で適切なサイズになります。理由はわかりませんが。