2015-04-26 13 views
6

stavo lavorando la mia strada attraverso un primer sulla programmazione R e ho notato una leggera anomalia:R: Int vs Num anomalia nel vettore

  • x <- c(2,1,1,5) produce un vettore di tipo num
  • y <- c(1:5) produce un vettore di tipo int
  • z <- c(1.5,2.3) produce un vettore di tipo num

Perché questo accade ? Qual è il tipo di dati fondamentale in R: è int o è num? Cosa succede se uno degli elementi nel vettore è un float, il tipo di vettore diventa float o è qualcos'altro? Cosa succede quando tutti gli elementi nel vettore sono float - perché è ancora num in questo caso?

+3

Tutti i numeri sono "double" s ('typeof (2)') se non diversamente specificato ('as.integer' o' L'). 'c' è una funzione che concatena e costruisce al più alto' typeof' dove nella tua "x" è "double". ':' è una funzione che restituisce un vettore "intero" in base alla progettazione. Inoltre, "numeric" è, anche, una classe e restituisce "TRUE" per "interi" e "double" (vedi '? Numerico'). –

+3

Dalla sezione ** Value ** del file della guida ('?": "'), 'Per gli argomenti numerici, un vettore numerico. Questo sarà di tipo intero se from è intero-valutato e il risultato è rappresentabile nel tipo R intero, altrimenti di tipo "double" (cioè modalità "numerico"). – nrussell

risposta

5

ci sono due distinti questione in gioco:

  1. In c(2, 1, 1, 5) sei esplicitamente creazione numeric tipi. Per integer, è necessario utilizzare c(2L, 1L, 1L, 5L) in quanto solo il suffisso L garantisce la creazione di un tipo integer (o il casting tramite as.integer() ecc.). Ma continua a leggere ...

  2. In c(1:5) entra in gioco un override storico per :. Poiché l'utilizzo coinvolge quasi sempre sequenze di interi, questo è ciò che ottieni: numeri interi.

Entrambe le forme sono documentate, quindi non è un'anomalia come suggerisce il titolo domanda.

+0

Ciao, @DirkEddelbuettel, di solito in languges come 'Python 'ecc.' L' è riservato per 'int: type long', perché' R' usa 'L' per type-casting per' int'. Inoltre, quale metodo dovrebbe essere preferito in pratica secondo te - 'c()' o 'c (:)'? Grazie mille :) – pranav

+4

La pratica del Python è irrilevante qui. Dai un'occhiata, ad esempio, al manuale [R Language Definition] (http://cran.r-project.org/doc/manuals/r-release/R-lang.html). Inoltre, R ha solo 'integer 'e nessuna distinzione tra diverse dimensioni di interi (cioè no' long int' o 'long long int'). –

+0

Grazie mille @DirkEddelbuettel, l'ho capito, mi chiedevo solo perché 'R' segua una pratica diversa nell'uso di' L' rispetto ad altri linguaggi come Python, C/C++, Java ecc. Grazie ancora :) – pranav