我对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
。我想到了一种可能性是指定环境并使用assign。因此,在我的错误代码中,我将使用以下语句: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