2010-06-28 9 views
16

Qual è la ragione per cui gli indici vettoriali in R iniziano con 1 anziché il solito 0?Perché gli indici vettoriali in R iniziano con 1, anziché 0?

Esempio:

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

è solo che vogliono memorizzare le informazioni extra sul vettore e non sapevano dove conservarlo se non come primo elemento del vettore?

+23

"Il solito' 0' "è piuttosto relativo. La mia prima tazza di caffè al mattino è il mio primo, non il mio zero-th. –

+7

Ma quando sei nato hai zero anni e devi aspettare un anno per il tuo primo compleanno. – Frank

+8

Poiché l'età è misurata in * anni completati *. Solo una convenzione diversa. Le mie dita sono ancora numerate da 1 a 10. –

risposta

34

FORTRAN è una lingua che avvia gli array a 1. I matematici trattano i vettori che iniziano sempre con la componente 1 e passano attraverso N. Le convenzioni di algebra lineare iniziano con la riga e la colonna numerate 1 e passano anche attraverso N.

C iniziato con zero a causa dell'aritmetica del puntatore che era implicita al di sotto. Java, JavaScript, C++ e C# sono stati seguiti da C.

+4

Esattamente. L'indicizzazione di C 0 mi è sempre sembrata del tutto priva di senso finché non ho appreso un po 'di aritmetica dei puntatori. Quindi aveva senso come scelta di design. – Sharpie

+5

@Sharpie, puoi spiegare quel commento? Conosco un po 'di suggerimenti, ma non ti seguo. – gwg

+2

Tuttavia, i puntatori non sono l'unica ragione; Anche Python parte da zero ma era basato sull'eleganza dell'affettare piuttosto che dei puntatori (ovviamente l'eleganza è soggettiva) - https://python-history.blogspot.nl/2013/10/why-python-uses-0-based- indexing.html – Mark

0

Stai sbagliando. Se si desidera memorizzare attributi aggiuntivi in ​​un oggetto, utilizzare 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

Cosa sto sbagliando? Non stavo cercando di memorizzare alcuna informazione aggiuntiva nel mio oggetto. – Frank

+5

Ho erroneamente letto l'ultima riga della tua domanda. Per rispondere alla tua domanda: R non è C. Questo è tutto. –

6

0 è solo "solito" perché è quello che ha fatto C, e un sacco di lingue successivi pedissequamente copiato la sintassi C. Per impostazione predefinita, gli array di Fortran sono basati su 1.

In Ada non esiste un valore predefinito e si devono selezionare gli intervalli di inizio e fine. È interessante notare che sembra che la maggior parte del codice abbia trovato "1" per il limite inferiore. Penso che sia un'indicazione abbastanza buona di dove la gente sarebbe andata data una libera scelta.

+1

La parte di copia pedissequamente non è del tutto vera, altri linguaggi popolari come Python hanno scelto deliberatamente lo 0 perché rende l'affettatura più elegante (almeno secondo il creatore). Dijkstra segue simili eleganza argomenti l'articolo qui https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html – Mark

15

I vettori in matematica sono spesso rappresentati come n-tuple, i cui elementi sono indicizzati da 1 an. Sospetto che r volesse rimanere fedele a questa notazione.

8

Frank, penso che tu stia interpretando male ciò che hai visto quando hai digitato arr [0]. Il numerico (0) significa semplicemente che il risultato è un vettore numerico senza elementi. Ciò non significa che il tipo di vettore venga "memorizzato" nell'elemento 0. Avresti ottenuto lo stesso risultato se avessi digitato, ad esempio, arr [arr> 30]. Nessun elemento soddisfa questa condizione, quindi il vettore risultato non ha elementi. Allo stesso modo, nessun elemento ha indice 0. Questo è intenzionale e non ha nulla a che fare con lo spazio 0 usato per qualcos'altro.

+0

Credo che questo sia [ciò Dirk cercare di spiegare] (http: // StackOverflow. it/questions/3135325/why-do-vector-indices-in-r-start-with-1-instead-of-0/3135372 # 3135372) ma hai capito il punto. +1 – Marek

2

In realtà, penso che la versione C che "inizia con 0" sia molto logica quando si osserva il modo in cui è organizzata la memoria. In C possiamo scrivere la seguente:

int* T = new int[10]; 

Il primo elemento dell'array è * T. Questo è perfettamente "logico" perché * T è l'indirizzo del primo caso di memoria puntato. Il secondo elemento è il secondo caso così * (T + 1): avanziamo di un "sizeof (int)".

Per rendere il codice più leggibile, C ha implementato un alias: T [i] per * (T + i). Per accedere al primo elemento, è necessario accedere a * T che è T [0]. È perfettamente naturale.

Questa idea è prorogato di iteratori:

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

T [i] è solo un alias per * (T.begin() + i).

in Fortran/R, abbiamo solito inizio con 1 a causa di problemi matematici, ma c'è sicuramente altre buone scelte (cf this link per esempio). Non dimenticare che fortran può facilmente utilizzare array che iniziano con 0:

PROGRAM ZEROARRAY 
REAL T(0:9) 
T(0) = 3.14 
END 
Problemi correlati