2013-07-23 7 views
5

Non ci sono capiti prima. Dalla pagina aiuto di pairs.panels nel pacchetto psych, si trova la seguente:Qual è il nome di questo trucco della sintassi e dove è documentato?

data(iris) 
pairs.panels(iris[1:4],bg=c("red","yellow","blue")[iris$Species],pch=21) 

voglio chiedere informazioni su questo argomento, che imposta il colore di sfondo dei cerchi disegnati per i punti dati: bg=c("red","yellow","blue")[iris$Species] Chiaramente, questo argomento soci i 3 livelli di iris$Species, un fattore, con i 3 colori indicati. Non sto chiedendo cosa faccia.

Mi chiedo in che modo viene chiamato questo modo di associare gli argomenti passati con i livelli di dati e dove è documentato? Sembra una magia R. Se stavo scrivendo questa funzione, probabilmente passerei i colori e il nome della colonna del fattore separatamente e quindi renderò manualmente l'associazione dietro le quinte. Questo trucco potrebbe essere molto utile. Ma a prima vista [iris$Species] sembra che i dati si stiano indicizzando da soli. Ad esempio, non è possibile digitare [iris$Species] nella console, ma solo dare un errore. È possibile digitare c("red","yellow","blue")[iris$Species] e ottenere la risposta corretta. Sembra che potrebbe esserci qualche riciclaggio in corso, ma non ne sono sicuro. Sarei curioso di sapere dove è documentato e se qualcuno può spiegare cosa sta succedendo in una breve frase o due. Ad esempio, [iris$Species] viene convertito in numero intero, quindi viene utilizzato per indicizzare l'elenco di 3 colori? Sto pensando che sia così, ma mi piacerebbe un'altra opinione.

Nota: lo stesso trucco è utilizzato in graphics::pairs su cui è basato panels.pairs.

+1

La fonte C per questo "trucco" può essere trovato qui: https://github.com/wch/r-source/blob/trunk/src/main/subset.c –

+0

Grazie Ferdinand . –

risposta

7

Ci sono due cose che accadono qui:

  1. Il fattore iris$Species è essere costretti a numerico/numero intero.
  2. Questi indici interi vengono utilizzati nel solito modo.

coercizione

Questo è importante perché le etichette fattori non sono rosso/giallo/blu in questo caso:

> all(c("red","yellow","blue")[iris$Species] == c("red","yellow","blue")[as.integer(iris$Species)]) 
[1] TRUE 
> all(c("red","yellow","blue")[iris$Species] == c("red","yellow","blue")[as.character(iris$Species)]) 
[1] NA 

indicizzazione con elementi ripetuti

In R , ogni volta che indicizzi un vettore semplice, gli elementi dell'indice che vengono ripetuti sono inclusi ripetutamente.

> x <- letters[1:5] 
> x 
[1] "a" "b" "c" "d" "e" 
> x[c(1,3)] 
[1] "a" "c" 
> x[c(1,3,3,3,3)] 
[1] "a" "c" "c" "c" "c" 

Questo è comunemente sfruttato durante il campionamento con la sostituzione.

Dove è documentato?

In una varietà di luoghi, anche se non sempre viene sottolineato quanto è bello.

Ad esempio, a pagina 11, W. N. Venables, D. M. Smith e R Development Core Team. Introduzione a R. Note su R: Un ambiente di programmazione per l'analisi e la grafica dei dati. Versione 2.5.0 (2007-04-23). stati:

> x[1:10] 
selects the first 10 elements of x (assuming length(x) is not less than 10). Also 
> c("x","y")[rep(c(1,2,2,1), times=4)] 
(an admittedly unlikely thing to do) produces a character vector of length 16 consisting of 
"x", "y", "y", "x" repeated four times. 
+0

Sì, penso di averlo appena capito. Magari dal parser, credo. Ancora piuttosto non ovvio, e penso di aver scritto un sacco di codice che non era necessario se me ne fossi reso conto. È documentato da qualche parte? Stavo pensando che potrebbe essere discusso in Data Manipulation di Phil Spector con R, ma non ho avuto il tempo di navigare. –

+0

@BryanHanson Sono abbastanza sicuro che sia nella maggior parte delle esercitazioni di base. –

+2

L'indicizzazione per fattori è menzionata in '? Estrai':" L'indicizzazione per fattori è consentita ed è equivalente all'indicizzazione tramite i codici numerici (vedere fattore) e non dai valori dei caratteri che sono stampati (per i quali utilizzare [come carattere (i)]) " – joran

Problemi correlati