リストを初期化する最もメモリ効率の良い方法は、そのリストをループ内で使用して結果を格納する場合にどのようなものがRにあるのだろうかと思います。私は、ループ内でオブジェクトを成長させることは、計算効率に重大な打撃を与える可能性があるので、できるだけ避けようとしています。Rのループの前にリストを初期化する最もメモリ効率の良い方法は何ですか?
私の問題は次のとおりです。私は個別に処理したいいくつかのデータグループを持っています。私のコードの要点は、各グループを一度に1つずつ実行し、いくつかのt検定を行い、統計的に有意な結果(したがって、各グループの可変長結果)のみを返すループがあることです。これまでは、各反復の結果を格納するためにlength(groups)
のリストを初期化しています。
私の主な質問は、オブジェクトがループ内で成長しないようにリストを初期化する方法です。
- 初期設定には
list = vector(mode = "list", length=length(groups))
を実行するだけで十分ですか?length(groups)
のリストを作成するだけなので、私は懐疑的ですが、各エントリはNULL
に等しくなります。私の懸案事項は、リストにデータを格納するためにループを繰り返すたびに、エントリがNULL
から結果ベクトルになるたびにオブジェクトを再コピーするということです。その場合、リストを初期化するのは実際にはありません非常に良い行います。しかし、list
の内部構造がどのように機能するのかわかりませんので、リストに格納されているベクトルへの参照を格納するだけで、再コピーは不要です。
- 他のオプションは、リストの各要素を、結果が持つ可能性のある最大長のベクトルに初期化することです。
- 有効な有効な結果の最大数がわかっているため、これは大きな問題ではありません。私がこのアプローチを取った場合、ループ内の結果ベクトルで各ベクトルを上書きします。メモリの最大量はすでに予約されているので、再コピー/拡張は発生しないことを願っています。しかし、私がこのアプローチを取ることは望ましくありません。もし、それが必要ではなく、上記の最初のオプションが十分なものであれば。以下は
私の問題
#initialize variables
results = vector(mode="list", length=length(groups)) #the line of code in question
y=1
tTests = vector(length = length(singleGroup))
#perform analysis on each group in groups
for(group in groups)
{
#returns a vector of p values with one entry per element in group
tTests = tTestFunction(group)
results[[y]] = tTests<=0.05
y=y+1
}
私は圧倒的多数がそうだと思います。「vector( "list"、length(groups))は、結果リストを初期化する方法です。質問は少し広いです。 –
おもちゃの例で両方のアイデアをテストするのは簡単です。 – joran