Простой цикл if-else в R
может кто-нибудь сказать мне, что не так с этим циклом if-else в R? Я часто не могу заставить циклы if-else работать. Я получаю сообщение об ошибке:
if(match('SubjResponse',names(data))==NA) {
observed <- data$SubjResponse1
}
else {
observed <- data$SubjResponse
}
отметим, что data
- это фрейм данных.
ошибка
Error in if (match("SubjResponse", names(data)) == NA) { :
missing value where TRUE/FALSE needed
2 ответов
как отметил @DirkEddelbuettel, вы не можете проверить NA
этак. Но вы можете сделать match
не возвращать NA
:
С помощью nomatch=0
и повернув на if
предложение (так как 0
трактуется как FALSE
), код можно упростить. Кроме того, еще одна полезная идиома кодирования-назначить результат предложения if, таким образом, вы не будете вводить имя переменной в одну из ветвей...
поэтому я бы написал это так:
observed <- if(match('SubjResponse',names(data), nomatch=0)) {
data$SubjResponse # match found
} else {
data$SubjResponse1 # no match found
}
по способ, если у вас "часто" возникают проблемы с if-else, вы должны знать две вещи:
объект для тестирования не должен содержать NA или NaN, или быть строкой (символом режима) или каким-либо другим типом, который нельзя принудить к логическому значению. Числовое значение в порядке: 0 -
FALSE
все остальное (кроме NA/NaN) - этоTRUE
.длина объекта должна быть ровно 1 (скалярная величина). Это можете быть больше, но тогда вы получите предупреждающий. Если он короче, вы получаете ошибку.
примеры:
len3 <- 1:3
if(len3) 'foo' # WARNING: the condition has length > 1 and only the first element will be used
len0 <- numeric(0)
if(len0) 'foo' # ERROR: argument is of length zero
badVec1 <- NA
if(badVec1) 'foo' # ERROR: missing value where TRUE/FALSE needed
badVec2 <- 'Hello'
if(badVec2) 'foo' # ERROR: argument is not interpretable as logical