Ошибка в 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]]).