Есть ли последовательный способ вызвать ошибки при неправильной индексации списка или вектора

Я ожидаю от других языков программирования, что (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) шагов вниз по строке, когда тихо распространяющаяся ошибка NULLs или 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
Другие вопросы по тегам