22

这个问题是由 Abiel Reinhart在此处提交的一个错误data.table引起的。我注意到同样的事情data.frame也发生了。

这是一个例子:

DF <- data.frame(x=1:5, y=6:10)
> DF*DF
   x   y
1  1  36
2  4  49
3  9  64
4 16  81
5 25 100

> class(DF*DF) # [1] "data.frame"

> DF^2
      x   y
[1,]  1  36
[2,]  4  49
[3,]  9  64
[4,] 16  81
[5,] 25 100

> class(DF^2) # [1] "matrix"

为什么“^”将其强制转换为矩阵?有任何想法吗?请注意,由解析器**转换为。^因此,doingDF**2的结果与DF^2.

我在?`^`.

编辑:尼尔的回答清楚地表明了在 a上操作时^返回 a的原因。如果也能回答为什么在这段代码中被遗漏的问题,那就太好了。matrixdata.frame ^

编辑 2:我也在R-help 上发帖,得到了 Duncan 的回复,似乎没有信息注册。新闻中的这种变化(诚然,这是一个相当古老的变化,正如 Joshua 和 Duncan 也指出的那样)。

4

1 回答 1

22

Ops.data.frame将数据帧的数学运算符实现为 S3 泛型,这是最后几行:

if (.Generic %in% c("+", "-", "*", "/", "%%", "%/%")) {
    names(value) <- cn
    data.frame(value, row.names = rn, check.names = FALSE, 
        check.rows = FALSE)
}
else matrix(unlist(value, recursive = FALSE, use.names = FALSE), 
    nrow = nr, dimnames = list(rn, cn))

所以^作为矩阵返回。

于 2013-11-13T21:44:05.930 回答