複数の関数を適用した結果を返すeach関数 - Seeking for my unique color.の続き。library(plyr)のeach関数にバグというかよろしくない実装があるのをかつどんさんが見つけた。よろしくないことが起こる例としては
> result <- 1:10 > each(length, mean, var)(rnorm(100)) length mean var 1.000000e+02 3.840182e-03 1.109176e+00 > result [[1]] NULL [[2]] NULL [[3]] NULL
というようなもの。each関数が関係ない変数に影響を与えてしまっている!!原因はソースを読むと分かる。
> each function (...) { fnames <- laply(match.call()[-1], deparse) fs <- list(...) if (length(fs[[1]]) > 1) { fs <- fs[[1]] snames <- as.list(match.call()[2])[[1]] fnames <- unlist(lapply(as.list(snames)[-1], deparse)) } char <- laply(fs, is.character) fnames[char] <- fs[char] fs[char] <- llply(fs[char], match.fun) unames <- names(fs) if (is.null(unames)) unames <- fnames unames[unames == ""] <- fnames[unames == ""] n <- length(fs) proto <- NULL if (n == 1) { function(x, ...) { res <- fs[[1]](x, ...) if (length(res) == 1) names(res) <- unames res } } else { function(x, ...) { if (is.null(proto)) { result <<- vector("list", length = n) names(result) <- unames for (i in 1:n) result[[i]] <- fs[[i]](x, ...) proto <<- list_to_vector(result) } else { for (i in 1:n) proto[[i]] <- fs[[i]](x, ...) } proto } } } <environment: namespace:plyr>
永続代入が原因となっている。ちょっと作者に報告してみようと思います。
追記
作者さんにバグ報告をしてみました。ちょっとの英語にえらい時間がかかっている俺っていったい。。。
よく見るとggplot2の作者さんだったので、「Tsukuba.R#6っていうイベントでggplot2を紹介されてもらうよ!素敵なパッケージをありがとう!」って伝えておきました。