2012-05-16 30 views
10

Digamos que tengo un vector, por ejemplo, x <- 1:10, luego x[0] devuelve un vector de longitud cero de la misma clase que x, aquí integer(0).¿por qué `x [0]` devuelve un vector de longitud cero?

Me preguntaba si hay una razón detrás de esa elección, en lugar de arrojar un error, o devolver NA como x[11] haría? Además, si puede pensar en una situación donde tener x[0] return integer(0) es útil, gracias por incluirlo en su respuesta.

+1

Por la misma razón x [FALSO] hace –

+2

@TylerRinker: Prima facie, es una pregunta interesante, ya que 'x [0]', que no se ha definido explícitamente, devuelve 'entero (0)', mientras 'x [11] ', que tampoco se ha definido explícitamente, devuelve' NA'. Además, la asignación explícita de 'x [0] <- 5' no devuelve ningún error o advertencia, pero' x [0] 'sigue siendo' entero (0) '. – jthetzel

+0

@TylerRinker, creo que entiendo por qué 'x [FALSE]' devuelve un vector de longitud cero: al extraer con lógicos (TRUE/FALSE), se necesita proporcionar un vector de la misma longitud que 'x'.Entonces en su ejemplo, 'FALSE' se recicla dando como resultado' x [rep (FALSE, length (x))] 'y no me sorprende que devuelva' integer (0) '. De la misma manera, 'x [TRUE]' devolverá 'x'. Pero no veo el enlace que haces entre 'x [0]' y 'x [FALSE]'. ¿Puedes por favor elaborar? – flodel

Respuesta

1

Creo que no soy un programador y ciertamente no contribuyo con la fuente R. Creo que puede deberse a que necesita algún tipo de marcador para indicar que algo ocurrió aquí, pero no se devolvió nada. Esto se vuelve más evidente con cosas como tables y split. Por ejemplo, cuando crea una tabla de valores y dice que hay cero de esa celda, debe mantener que esa celda hecha de una cadena en un vector no tiene valores. no sería apropiado tener x[0]==0 ya que no es el valor numérico de cero sino la ausencia de cualquier valor.

Así que en las siguientes divisiones que necesitamos un marcador de posición y integer(0) ocupa el lugar de ningún valor devuelto que no es lo mismo que 0. Aviso para el segundo vuelve numeric(0) que todavía es un marcador de posición indicando que era el lugar numérico poseedor.

with(mtcars, split(as.integer(gear), list(cyl, am, carb))) 
with(mtcars, split(gear, list(cyl, am, carb))) 

Así que en cierto modo en que mi x[FALSE] réplica es cierto, ya que ocupa el lugar de la mancha inexistente cero en el vector.

De acuerdo, esta balonga que acabo de vomitar es cierta hasta que alguien la discute y la derriba.

página PS 19 de esta guía (LINK) afirman que integer() and integer(0) are empty integer.

relacionados, de manera mensaje:How to catch integer(0)?

+0

Aún así, no creo que esto responda a la pregunta de por qué no devuelve NA como x [11]. – Dason

+0

Porque 'x [11]' existe, solo falta. Pruebe 'x [15] <- 3; x' y verá en un vector que técnicamente todos los valores enteros existen, excepto 0. Incluso' x [Inf] 'existe, solo falta (' NA') donde como 'x [ 0] 'nunca puede existir. Piensa en el 'x [n]' como posicionamiento y tiene sentido. No existe la posición 'x [0]'. –

+0

@TylerRinker: Estoy de acuerdo contigo, pero para continuar la discusión, si x [0] no existe, ¿por qué 'x [0] <- 1' no devuelve una advertencia o error? ¿No esperaríamos que devuelva algo así como 'invalid first argument', que es el mensaje de error devuelto por' assign (x [0], 1) '? – jthetzel

2

Dado que los índices de matriz se basan-1, índice de 0 no tiene sentido. El valor se ignora como un índice vectorial.

8

Como se ve en ?"["

NA y valores cero están permitidos: filas de una matriz de índice que contiene un cero son ignorados, mientras que las filas que contienen un NA producen una NA en el resultado .

Así que un índice de 0 simplemente se ignora. Podemos ver esto en la siguiente

x <- 1:10 
x[c(1, 3, 0, 5, 0)] 
#[1] 1 3 5 

lo tanto, si el único índice que damos es 0, entonces la respuesta apropiada es devolver un vector vacío.

+0

+ 1 para citar el manual. –

+0

Gracias @Dason. Creo que vale la pena señalar que la oración que cita es parte de la sección "Matrices y matrices", y no "Vectores atómicos", por lo que no está documentando explícitamente o respondiendo mi pregunta, pero tal vez se puede utilizar para la extrapolación. – flodel

+0

De cualquier manera, aunque puede ayudar a la discusión, no estoy tan interesado en una respuesta "porque la documentación lo dice"; Estoy más interesado acerca de por qué se hizo esta elección en particular. Algunas de las otras respuestas y comentarios ofrecen alguna explicación plausible de por qué no debe devolver 'NA' como 'x [11]'. Así que me pregunto por qué los desarrolladores no eligieron lanzar un error en su lugar. – flodel

Cuestiones relacionadas