Подтвердить что ты не робот

Функции утилизации и назначения (`split <-`)

Может кто-нибудь объяснить мне, как работает эта одна строка кода R?

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

Код делает то, что я хочу сделать (назначить max по группе), но вопрос в том, как это делается?

4b9b3361

Ответ 1

Разделение дает значения dat[c(1,2,4)] и dat[c(3,5,6)] из вектора.

Назначение эквивалентно dat[c(1,2,4)] <- 100 ; dat[c(3,5,6)] <- 300, и здесь происходит рециркуляция.

Edited

Что касается того, что происходит, и почему результаты векторного назначения, см. стр. 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 возвращает измененный вектор.

Ответ 2

Благодаря комментарию, ответ находится в 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
}