読者です 読者をやめる 読者になる 読者になる

library(plyr)のeach関数にバグがある件→作者さんに報告しました

R

複数の関数を適用した結果を返す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を紹介されてもらうよ!素敵なパッケージをありがとう!」って伝えておきました。