2013-01-12 9 views
16

Kann mir bitte jemand erklären, wie diese eine Zeile R-Code funktioniert?Recycling- und Zuweisungsfunktionen (`split <-`)

split(dat, f) <- lapply(split(dat, f), max) 

Ich dachte, es ist nur eine Recycling-Regel, aber wirklich kann ich es nicht verstehen.

Daten Beispiel:

dat <- c(1, 2, 3, 100, 200, 300) 
f <- as.factor(c("a", "a", "b", "a", "b", "b")) 
split(dat, f) <- lapply(split(dat, f), max) 
dat 
[1] 100 100 300 100 300 300 

Der Code tun, was ich (ordnen Sie die max von Gruppe), aber die Frage ist, wie dies geschieht, tun wollen?

+5

Blick auf '\' aufgeteilt < -.default \ ". –

+2

ein weiterer schöner Kaboom Moment aus dem R Handbuch – mdsumner

Antwort

9

Die Teilung ergibt die Werte dat[c(1,2,4)] und dat[c(3,5,6)] aus dem Vektor.

Die Zuordnung entspricht dat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300 und hier findet das Recycling statt.

Herausgegeben

Als für das, was geschieht, und warum ein Vektorbelegung Ergebnisse finden Sie auf Seite 21 der Sprachdefinition Handbuch (http://cran.r-project.org/doc/manuals/R- lang.pdf). Der Aufruf:

‘*tmp*‘ <- def 
def <- "split<-"(‘*tmp*‘, f, value=Z) 
rm(‘*tmp*‘) 

Beachten Sie, dass split<-.default kehrt der modifizierte Vektor:

split(def, f) <- Z 

Wird als interpretiert.

+0

Danke! Ich mag diese Antwort. Myabe müssen Sie erklären, warum wir einen Vektor und nicht eine Liste als Ergebnis erhalten. – agstudy

5

Dank der Kommentar, lautet die Antwort in split<-.default

Gerade sein Verhalten zu erklären, hier ich das split<-.default mit Ergebnis meines Anrufs in der Frage stellen

`split<-.default` <- function(dat, f,value = lapply(split(dat, f), max)) 
{ 
    ix <- split(seq_along(dat), f, drop = drop, ...) ## the call of split here!! 
    n <- length(value) 
    j <- 0 
    for (i in ix) { 
     j <- j %% n + 1 
     x[i] <- value[[j]] ## here we assign the result of the first split 
    } 
    x 
}