1

ここにいくつかのコードがあります.rowSumsが壊れたときに壊れる理由と、test3のクラスを変更すると修正される理由がわかりません。これは奇妙に思えます。バグですか?そうでない場合、何が欠けていますか?

library(reshape)

test <- data.frame(x=1:5)
rowSums(test)  # Works
class(test)  # "data.frame"

## Trying to break rowSums; see below
class(test) <- c("data.frame", "cast_df")
rowSums(test)  # Works, but see below

vars <- c("x", "y", "z")
test2 <- data.frame(label=rep(c("A", "B"), c(3, 3)),
                    variable=rep(vars, 2),
                    value=1:6)

test2.cast <- cast(test2, label ~ variable, value="value")

rowSums(test2.cast[, vars])  # Works
rowSums(test2.cast[, "y"])  # Breaks because of drop=TRUE

test3 <- test2.cast[, "y", drop=FALSE]
rowSums(test3)  # Why does this break?
class(test3)  # c("cast_df", "data.frame")
class(test3) <- "data.frame"
rowSums(test3)  # Works!  Why?

コンテキスト: キャストによって生成された大きなデータ フレームがあります。次に、そのデータ フレームの列のいくつかの異なるサブセットに対してプログラムで rowSums を呼び出します。サブセットに列が 1 つしかないときにこの動作に気付きました。これは再現可能な小さな例です。

4

1 に答える 1

2

rowSumsを呼び出しますas.matrix。の最初の 2 行は次のas.matrix.cast_dfとおりです。

ids <- attr(x, "idvars")
mat <- as.matrix.data.frame(x[, setdiff(names(x), ids)])

そこの欠如に注意してくださいdrop = TRUE。クラスをリセットするdata.frameと、このメソッドは呼び出されず、代わりに通常のas.matrix.data.frameメソッドが直接呼び出され、問題はありません。

于 2013-07-26T22:31:07.420 に答える