2015-02-09 10 views
5

Sto cercando di imparare come usare R. Posso usarlo per fare cose basilari come leggere i dati ed eseguire un t-test. Tuttavia, sto lottando per capire il modo in cui R è strutturata (ho uno sfondo java molto mediocre).Cercando di capire la struttura R: cosa significa un punto nei nomi di funzioni?

Quello che non capisco è il modo in cui le funzioni sono classificate.

Ad esempio in is.na(someVector), è is una classe? O per read.csv, è csv un metodo della classe read?

Ho bisogno di un modo più semplice per imparare le funzioni rispetto alla semplice memorizzazione casuale. Mi piace l'idea di cose che appartengono ad altre cose. A me sembra che questo dia ad una lingua una struttura ad albero che renda l'apprendimento più efficiente.

Grazie

Scusate se questa è una domanda ovvia Sono sinceramente confuso e ho letto/la visione di un bel paio di tutorial.

+0

'is.na' e' read.csv' sono i nomi delle funzioni. È possibile accedere ai rispettivi file della guida digitando '? Is.na' e'? Read.csv'. –

+0

Sarebbe corretto affermare che is.na() e is.numeric() non sono correlati? O appartengono a qualcosa? – NicoFish

+2

'is' viene ripetuto per un certo numero di funzioni tutte che fanno cose simili, vale a dire testare se l'oggetto ha una caratteristica particolare:' is.vector' 'is.numeric'' is.matrix'' is.function' etc etc. Same per 'leggere', normalmente per importare i dati:' read.csv' 'read.fwf'' read.fortran' ecc. Sono una convenzione di denominazione. – thelatemail

risposta

13

tua confusione è del tutto comprensibile, poiché R mescola due convenzioni di utilizzo (1) . come separatore di parole di uso generale (come in is.na(), which.min(), update.formula(), data.frame() ...) e (2) . come indicatore di un metodo S3, method.class (ovvero foo.bar() sarebbe il metodo "pippo" per oggetti con l'attributo di classe "barra"). Ciò rende particolarmente confuse le funzioni come summary.data.frame() (vale a dire il metodo summary per oggetti con classe data.frame).

Come @thelatemail sottolinea sopra, vi sono alcune altre serie di funzioni che ripetono lo stesso prefisso per una varietà di differenti opzioni (come in read.table(), read.delim(), read.fwf() ...), ma questi sono del tutto convenzionale, non specificato ovunque nella definizione del linguaggio formale.

dotfuns <- apropos("[a-z]\\.[a-z]") 
dotstart <- gsub("\\.[a-zA-Z]+","",dotfuns) 
head(dotstart) 
tt <- table(dotstart) 
head(rev(sort(tt)),10) 
## as is print Sys file summary dev format all sys 
## 118 51  32 18 17  16 16  15 14 13 

(Alcuni di questi sono effettivamente generici S3, altri no. Ad esempio, Sys.*(), dev.*() e file.*() no.)

Storicamente _ è stato usato come un collegamento per l'operatore di assegnazione <- (prima che = fosse disponibile come sinonimo), quindi non era disponibile come separatore di parole. Non so per caso perché CamelCase non è stato adottato invece.

Confusamente, methods("is") rendimenti is.na() tra molti altri, ma è efficace solo alla ricerca di funzioni il cui nome inizia con "è".; avvisa che "function 'is' appears not to be generic"

Rasmus Bååth's presentation on naming conventions è informativo e divertente (se un po 'deprimente).

credito extra: ci sono dei nomi dei metodi S3 separati da punti, vale a dire i casi in cui un nome di funzione della forma x.y.z rappresenta il metodo x.y per gli oggetti con attributo class z?

risposta (da Hadley Wickham nei commenti): as.data.frame.data.frame() vittorie.as.data.frame è un generico S3 (diverso da, ad esempio as.numeric) e as.data.frame.data.frame è il suo metodo per gli oggetti data.frame. Il suo scopo (da ?as.data.frame):

Se un frame di dati viene fornita, tutte le classi precedenti ‘ 'data.frame'’ sono spogliato, ei nomi di riga viene modificato se questo argomento è fornito.

+0

Ho sempre trovato la funzione 'as.data.frame.matrix' come un uso eclatante di punti. – jalapic

+0

'as.data.frame.factor' per i punti bonus! –

+0

non tecnicamente, penso, perché (1) 'as' è ** not ** in realtà un S3 generico (confronta' print' e 'as' ...) e (2)' as' non è la parte punteggiata. (Uno dei limiti dei metodi S3 è che non possono fare più spedizioni ...) Ma sì, nello spirito della cosa. –

Problemi correlati