2010-06-28 18 views
16

¿Cuál es la razón por la que los índices vectoriales en R comienzan con 1, en lugar del 0 habitual?¿Por qué los índices vectoriales en R comienzan con 1, en lugar de 0?

Ejemplo:

> arr<-c(10,20) 
> arr[0] 
numeric(0) 
> arr[1] 
[1] 10 
> arr[2] 
[1] 20 

¿Es justo que quieren almacenar información adicional sobre el vector y no sabían dónde guardarlo excepto como primer elemento del vector?

+23

"Usual' 0' "es algo relativo. Mi primera taza de café por la mañana es la primera, no la cero. –

+7

Pero cuando naces tienes cero años y tienes que esperar un año para tu primer cumpleaños. – Frank

+8

Porque la edad se mide en * años completos *. Solo una convención diferente. Mis dedos todavía están numerados del 1 al 10. –

Respuesta

34

FORTRAN es un lenguaje que inicia arreglos en 1. Los matemáticos tratan con vectores que siempre comienzan con el componente 1 y pasan N. Las convenciones de álgebra lineal comienzan con filas y columnas numeradas 1 y pasan también por N.

C comenzó con cero debido a la aritmética del puntero que estaba implícita debajo. Java, JavaScript, C++ y C# hicieron lo mismo desde C.

+4

Exactamente. La indexación de C 0 siempre me pareció completamente sin sentido hasta que aprendí un poco sobre la aritmética del puntero. Entonces tuvo sentido como una opción de diseño. – Sharpie

+5

@Sharpie, ¿puedes explicar ese comentario? Sé un poco sobre los indicadores pero no te sigo. – gwg

+2

Sin embargo, los punteros no son la única razón; Python también comienza en cero, pero se basa en la elegancia de cortar en lugar de punteros (la elegancia es subjetiva, por supuesto) - https://python-history.blogspot.nl/2013/10/why-python-uses-0-based- indexing.html – Mark

0

Lo estás haciendo mal. Si desea almacenar atributos adicionales en un objeto, utilice attr:

> foo <- 1:20 
> attr(foo, "created") <- Sys.time()    # just as an example 
> str(foo) 
atomic [1:20] 1 2 3 4 5 6 7 8 9 10 ... 
- attr(*, "created")= POSIXct[1:1], format: "2010-06-28 14:07:15" # our time 
> summary(foo)          # object works as usual 
    Min. 1st Qu. Median Mean 3rd Qu. Max. 
    1.00 5.75 10.50 10.50 15.20 20.00 
> 
+2

¿Qué estoy haciendo mal? No estaba tratando de almacenar información adicional en mi objeto. – Frank

+5

Leí mal la última línea de su pregunta. Para responder a su pregunta: R no es C. Eso es todo. –

6

0 sólo es "habitual" porque eso es lo que hizo C, y una gran cantidad de lenguas posteriores copian servilmente sintaxis C. Por defecto en Fortran las matrices están basadas en 1.

En Ada no hay un valor predeterminado y debe elegir los rangos de inicio y fin. Curiosamente, parece que la mayoría de los códigos que he encontrado seleccionan '1' para el límite inferior. Creo que es una buena indicación de a dónde habría ido la gente si tuviera una opción libre.

+1

La parte copiadora servil no es del todo cierta, otros lenguajes populares como Python eligieron deliberadamente la basada en 0 porque hace el corte más elegante (según el creador, al menos). Dijkstra sigue argumentos de elegancia similares al artículo aquí https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html – Mark

15

Los vectores en matemáticas a menudo se representan como n-tuplas, cuyos elementos están indexados de 1 a n. Sospecho que quería seguir siendo fiel a esta notación.

3

R es una "plataforma para la experimentación y la investigación". Su objetivo es habilitar "statisticians to use the full capabilities of such an environment" sin volver a pensar la forma en que generalmente se ocupan de las estadísticas. Entonces la gente usa fórmulas para hacer modelos de regresión, y las personas comienzan a contar en 1.

8

Frank, creo que estabas malinterpretando lo que viste cuando escribiste arr [0]. El valor numérico (0) solo significa que el resultado es un vector numérico sin elementos. No significa que el tipo del vector esté siendo "almacenado" en el elemento 0. Habría obtenido el mismo resultado si hubiera escrito, por ejemplo, arr [arr> 30]. Ningún elemento cumple esa condición, por lo que el vector resultante no tiene elementos. Del mismo modo, ningún elemento tiene el índice 0. Esto es intencional, y no tiene nada que ver con el espacio 0 que se utiliza para otra cosa.

+0

Creo que es [lo que Dirk intenta explicar] (http: // stackoverflow. com/questions/3135325/why-do-vector-index-in-r-start-with-1-instead-of-0/3135372 # 3135372) pero ya entendió el punto. +1 – Marek

2

En realidad, creo que la versión similar a C que "comienza con 0" es muy lógica cuando se mira la forma en que se organiza la memoria. En C podemos escribir lo siguiente:

int* T = new int[10]; 

El primer elemento de la matriz es * T. Esto es perfectamente "lógico" porque * T es la dirección de la primera caja de memoria apuntada. El segundo elemento es el segundo caso por lo que * (T + 1): avanzamos en un "tamaño de (int)".

Para que el código sea más legible, C implementó un alias: T [i] para * (T + i). Para acceder al primer elemento, debe acceder a * T que es T [0]. Eso es perfectamente natural.

Esta idea se extiende por los iteradores:

std::vector<int> T(10); 
int val = *(T.begin()+3); 

T [i] es sólo un alias para * (T.begin() + i).

En fortran/R, generalmente comienza con 1 debido a problemas matemáticos, pero sin duda hay otras buenas opciones (cf this link por ejemplo). No olvide que fortran puede usar fácilmente una matriz que comience con 0:

PROGRAM ZEROARRAY 
REAL T(0:9) 
T(0) = 3.14 
END 
Cuestiones relacionadas