Я совершенно новичок в R, и я смущен правильным использованием tryCatch
. Моя цель - сделать прогноз для большого набора данных. Если предсказания не могут вписаться в память, я хочу обойти проблему, разбив мои данные.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
из моей функции ошибки. Я решил, что одна из возможностей - указать среду и использовать назначение. Таким образом, я бы использовал следующие операторы в моем коде ошибки:
rm(large_data_frame, envir = parent.env(environment()))
[...]
assign('large_vector', large_vector, parent.env(environment()))
Однако это решение кажется довольно грязным для меня. Интересно, есть ли возможность достичь моей цели с помощью «чистого» кода?
[EDIT] Похоже, что возникает некоторая путаница, потому что я поставил вышеприведенный код, чтобы проиллюстрировать проблему, а не приводить рабочий пример. Вот минимальный пример, который показывает проблему пространства имен:
# 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
проверки второго редактирование моего ответа, я добавил маленький кончик там, который может пригодиться в некоторых ситуациях. –