Como se señaló @DirkEddelbuettel, no se puede probar NA
de esa manera. Pero se puede hacer match
no vuelve NA
:
Mediante el uso de nomatch=0
y revertir la cláusula if
(ya que se trata como 0
FALSE
), el código se puede simplificar. Por otra parte, otro lenguaje de codificación de utilidad es asignar el resultado de la cláusula if, de esa manera no se escribe mal el nombre de variable en una de las ramas ...
Así que me gustaría escribir así:
observed <- if(match('SubjResponse',names(data), nomatch=0)) {
data$SubjResponse # match found
} else {
data$SubjResponse1 # no match found
}
Por cierto si usted "con frecuencia" tiene problemas con if-else, se debe tener en cuenta dos cosas:
el objeto de prueba no debe contener NA o NaN, o ser una cadena (carácter de modo) o algún otro tipo que no se puede forzar en un valor lógico. Numérica está bien: 0 es FALSE
cualquier otra cosa (pero NA/NaN) es TRUE
.
La longitud del objeto debe ser exactamente 1 (un valor escalar). Se puede ser más largo, pero entonces se obtiene una advertencia. Si es más corto, obtienes un error.
Ejemplos:
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
'match' será * siempre * devolver un vector de la misma longitud que el primer argumento (' x'). Entonces, en este caso, siempre un valor escalar. – Tommy
Circule 8.1.4 de 'The R Inferno' http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –