Подтвердить что ты не робот

Почему "^" на data.frame возвращает матрицу вместо data.frame, например "*"?

Этот вопрос мотивирован ошибкой поданной здесь 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"

Почему "^" принуждает его к матрице? Есть идеи? Обратите внимание, что ** преобразуется в ^ парсером. Таким образом, выполнение DF**2 даст тот же результат, что и DF^2.

Я не нахожу ничего связанного с этим принуждением в ?`^`.

Изменить: Нильный ответ ясно показывает причину ^ возврата matrix при работе на data.frame. Было бы замечательно, если бы вопрос о , почему ^ не учитывается в этом фрагменте кода, также можно ответить.

Изменить 2: Я также разместил здесь, в R-help, и получил ответ от Duncan, что, похоже, нет никакой информации. это изменение в новостях (по общему признанию, это довольно старое изменение, как указывали Джошуа и Дункан).

4b9b3361

Ответ 1

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))

Итак, ^ возвращается как матрица.