Есть ли последовательный способ вызвать ошибки при неправильной индексации списка или вектора
Я ожидаю от других языков программирования, что
(1:4)[3:5]
и
list(asdf = 4, qwerty = 5)$asdg
оба должны вызывать исключения. Вместо этого первый молча возвращается
c(3, 4, NA)
, а второй молча возвращается (как это делает или
list(asdf = 4, qwerty = 5)[[asdg]]
).
Хотя такое поведение иногда может быть полезным, гораздо чаще (по моему опыту) оно приводит к незначительной опечатке, постепенной ошибке или невозможности переименовать переменную везде, где она используется, из триггера для немедленного и простого -to-debug error, в триггер для действительно сбивающей с толку ошибки примерно на 20 (или 200) шагов вниз по строке, когда тихо распространяющаяся ошибка
NULL
s или s наконец попадают в функцию или операцию, о которых громко говорят. (Конечно, это все же лучше, чем когда-либо вообще не выдает ошибок, а только приводит к мусору.)
data.frame()[,'wrong']
выдает ошибку, но
data.frame()['wrong',]
просто возвращается
NA
.
Я ищу способ сделать vector / array / list / data.frame / и т. Д. доступ к подписке / члену, который немедленно вызовет ошибку, если я использую недействительный индекс. Для списков
get('wrong', list())
делает то, что я ищу, но иногда это может быть довольно некрасиво (особенно, если использовать результат как подпись чего-то другого). Его можно использовать, но было бы неплохо. Для векторов (и строк data.frame) даже это не работает.
Есть хороший способ сделать это?
1 ответ
Я не уверен, что вы можете изменить это поведение глобально, но вы можете обрабатывать их индивидуально по мере необходимости в зависимости от типа данных.
Например, для векторов -
subset_values <- function(x, ind) {
if(min(ind) > 0 && max(ind) <= length(x)) x[ind]
else stop('Incorrect length')
}
subset_values(1:4, 3:5)
#Error in subset_values(1:4, 3:5) : Incorrect length
subset_values(1:4, -1:3)
#Error in subset_values(1:4, -1:3) : Incorrect length
subset_values(1:4, 1:3)
#[1] 1 2 3