私は R にまったく慣れていないため、 の正しい使用法に混乱していますtryCatch
。私の目標は、大規模なデータ セットの予測を行うことです。予測がメモリに収まらない場合は、データを分割して問題を回避したいと考えています。
現在、私のコードはおおよそ次のようになっています。
tryCatch({
large_vector = predict(model, large_data_frame)
}, error = function(e) { # I ran out of memory
for (i in seq(from = 1, to = dim(large_data_frame)[1], by = 1000)) {
small_vector = predict(model, large_data_frame[i:(i+step-1), ])
save(small_vector, tmpfile)
}
rm(large_data_frame) # free memory
large_vector = NULL
for (i in seq(from = 1, to = dim(large_data_frame)[1], by = 1000)) {
load(tmpfile)
unlink(tmpfile)
large_vector = c(large_vector, small_vector)
}
})
ポイントは、エラーが発生しない場合、large_vector
期待どおりに私の予測で満たされているということです。エラーが発生した場合、large_vector
エラー コードの名前空間にのみ存在するように見えます。関数として宣言したため、これは理にかなっています。large_data_frame
同じ理由で、削除できないという警告が表示されます。
残念ながら、この動作は私が望んでいるものではありません。large_vector
エラー関数内から変数を割り当てたいと思います。1つの可能性は、環境を指定して割り当てを使用することだと考えました。したがって、エラー コードで次のステートメントを使用します。
rm(large_data_frame, envir = parent.env(environment()))
[...]
assign('large_vector', large_vector, parent.env(environment()))
ただし、このソリューションはかなり汚いようです。「きれいな」コードで私の目標を達成する可能性があるかどうか疑問に思いますか?
[編集] 上記のコードは、主に問題を説明するためのものであり、実際の例を示すためのものではないため、混乱しているようです。名前空間の問題を示す最小限の例を次に示します。
# Example 1 : large_vector fits into memory
rm(large_vector)
tryCatch({
large_vector = rep(5, 1000)
}, error = function(e) {
# do stuff to build the vector
large_vector = rep(3, 1000)
})
print(large_vector) # all 5
# Example 2 : pretend large_vector does not fit into memory; solution using parent environment
rm(large_vector)
tryCatch({
stop(); # simulate error
}, error = function(e) {
# do stuff to build the vector
large_vector = rep(3, 1000)
assign('large_vector', large_vector, parent.env(environment()))
})
print(large_vector) # all 3
# Example 3 : pretend large_vector does not fit into memory; namespace issue
rm(large_vector)
tryCatch({
stop(); # simulate error
}, error = function(e) {
# do stuff to build the vector
large_vector = rep(3, 1000)
})
print(large_vector) # does not exist