2013-01-12 38 views
16

有人能解釋一下這一行R代碼的工作原理嗎?回收和分配功能(`split <-`)

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

我認爲這只是一個回收規則,但我真的不明白它。

數據例如:

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 

的代碼做我想做的事(可以按組分配的最大值),但問題是如何做到這一點?

+5

看看'\'分裂的結果< -.default \''。 –

+2

從R手冊 – mdsumner

回答

9

該分割從矢量中給出值dat[c(1,2,4)]dat[c(3,5,6)]

該作業相當於dat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300,這是回收發生的地方。

編輯

至於發生了什麼,爲什麼一個矢量分配結果,請參見語言定義手冊第21頁(http://cran.r-project.org/doc/manuals/R- lang.pdf)。召喚:

split(def, f) <- Z 

被解釋爲:

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

注意split<-.default返回修改後的矢量。

+0

另一個可愛的kaboom時刻謝謝!我喜歡這個答案。你需要解釋爲什麼我們得到一個向量而不是結果列表。 – agstudy

5

多虧了評論,答案是split<-.default

只是爲了解釋其行爲,這裏我所說的split<-.default與我的問題調用

`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 
}