2013-01-12 3 views
16

誰かがこの1行の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

ルックで私の呼び出しの結果でsplit<-.defaultを呼び出します< -default \ '' –

+2

Rマニュアルより素敵なkaboomの瞬間 – mdsumner

答えて

9

分裂は、ベクターからの値dat[c(1,2,4)]およびdat[c(3,5,6)]を与える。

割り当てはdat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300に相当し、リサイクルが行われます。

はhttp://cran.r-project.org/doc/manuals/R-(言語定義マニュアルの21ページを参照してください、何が起こるについては

を編集し、なぜベクトル割付結果lang.pdf)。コール:split<-.defaultが修正ベクトルを返すこと

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

注:

split(def, f) <- Z 

は、次のように解釈されます。コメントへ

+0

ありがとう!私はこの答えが好きです。 Myabeあなたは結果としてリストではなくベクトルを得る理由を説明する必要があります。 – agstudy

5

おかげで、答えはただ、その動作を説明するために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 
} 
関連する問題