Ошибка в if/while (условие) {: аргумент имеет длину 0
Я получил ошибку
Error in if (condition) { : argument is of length zero
или
Error in while (condition) { : argument is of length zero
Что вызывает это сообщение об ошибке, и что это значит?
При дальнейшем осмотре кажется, что значение NULL
.
condition
## NULL
Чтобы справиться с этой ошибкой, как мне проверить значения NULL?
Я ожидал, что это вернет TRUE
, но я получил пустое логическое значение:
condition == NULL
## logical(0)
Ответы
Ответ 1
См. ?NULL
Вы должны использовать is.null
'is.null возвращает' TRUE, если его аргумент равен 'NULL и' FALSE в противном случае.
Попробуйте следующее:
if ( is.null(hic.data[[z]]) ) { print("is null")}
Из раздела 2.1.6 Определение языка R
Имеется специальный объект с именем NULL. Он используется всякий раз, когда необходимо указывать или укажите, что объект отсутствует. Его не следует путать с вектором или списком нулей длина. Объект NULL не имеет типа и не имеет модифицируемых свойств. Существует только один объект NULL в R, к которому относятся все экземпляры. Для проверки использования NULL is.null. Вы не можете устанавливать атрибуты на NULL.
Ответ 2
Что вызывает это сообщение об ошибке, и что это значит?
Операторы if
принимают одно логическое значение (технически логический вектор длины один) как вход для условия.
Ошибка возникает, когда условие ввода равно нулю. Вы можете воспроизвести его, например:
if (logical()) {}
## Error: argument is of length zero
if (NULL) {}
## Error: argument is of length zero
Общие ошибки, приводящие к этой ошибке
Легко случайно вызвать эту ошибку при использовании индексации $
. Например:
l <- list(a = TRUE, b = FALSE, c = NA)
if(l$d) {}
## Error in if (l$d) { : argument is of length zero
Также используя if
- else
, когда вы имели в виду ifelse
, или переопределение T
и F
.
Обратите внимание на эти связанные ошибки и предупреждения для других плохих условий:
Ошибка в if/while (условие) {: отсутствует Значение, в котором требуется TRUE/FALSE
Ошибка в if/while (условие): аргумент не интерпретируется как логический
if (NA) {}
## Error: missing value where TRUE/FALSE needed
if ("not logical") {}
## Error: argument is not interpretable as logical
if (c(TRUE, FALSE)) {}
## Warning message:
## the condition has length > 1 and only the first element will be used
Как проверить такие значения?
NULL
значения могут быть протестированы для использования is.null
. Подробнее см. Ответ GSee.
Чтобы сделать ваши звонки if
безопасными, хороший шаблон кода:
if(!is.null(condition) &&
length(condition) == 1 &&
!is.na(condition) &&
condition) {
# do something
}
Вы также можете посмотреть assert_is_if_condition
от assertive.code
.
Ответ 3
При тестировании значений NULL вы хотите использовать is.null(hic.data[[z]])
.