为什么data.frame上的"^"返回矩阵而不是像"*"那样的data.frame?

Aru*_*run 22 r operators exponentiation dataframe

这个问题是由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"
Run Code Online (Sandbox Code Playgroud)

为什么"^"将其强制转换为矩阵?有任何想法吗?请注意,由解析器**转换为^.所以,做DF**2会得到与之相同的结果DF^2.

我没有找到与此强制有关的任何内容?`^`.

编辑:尼尔的回答清楚地显示^matrix在操作时返回的原因data.frame.如果可以回答关于为什么 ^被遗漏在那段代码中的问题,那就太棒了.

编辑2:我也在这里发布了R-help并得到了Duncan的回复,似乎没有信息注册.新闻中的这种变化(诚然,正如约书亚和邓肯所指出的那样,这是一个相当古老的变化).

Nea*_*ltz 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))
Run Code Online (Sandbox Code Playgroud)

因此^作为矩阵返回.

  • 根据[这个回购](https://github.com/SurajGupta/r-source/blame/master/src/library/base/R/),看起来该行是在当天用R 2.2.0编写的. dataframe.R#L1528),所以我会把它归结为'遗留行为'. (7认同)
  • :)好极了.很好找!现在知道为什么`^`错过了吗? (4认同)
  • 自1999-01-29修订版3475以来,这条线大致以该形式存在.如果这是一个错误,我严重怀疑你现在可以改变它而不会破坏事情. (3认同)