Почему ^ в data.frame возвращает матрицу вместо data.frame, как это делает *?

Этот вопрос вызван ошибкой, зарегистрированной здесь Абиэлем Рейнхартом на 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 и получил ответ от Дункана, что, похоже, нет информации о рег. это изменение в НОВОСТЯХ (правда, это довольно старое изменение, на что также указали Джошуа и Дункан).


person Arun    schedule 13.11.2013    source источник
comment
Тогда это запрос функции? Если вы предпочитаете значение по умолчанию.   -  person Simon O'Hanlon    schedule 14.11.2013


Ответы (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))

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

person Neal Fultz    schedule 13.11.2013
comment
:) Отлично. Очень хорошая находка! Теперь есть идеи, почему ^ пропущено?? - person Arun; 14.11.2013
comment
Похоже, что когда-то эта строка была написана на R 2.2.0, согласно этого репозитория, поэтому я бы списал это на "устаревшее поведение". - person Neal Fultz; 14.11.2013
comment
Вы можете легко переопределить Ops.data.frame, чтобы включить "^" в вектор допустимых функций. Он вернет data.frame с правильными результатами, но я уверен, что у R-Core будет (хорошая?) причина, почему его там нет. Возможно, этот стоит отправить либо в r-help, либо в r-devel. - person Simon O'Hanlon; 14.11.2013
comment
Примерно в таком виде эта линия существует с версии 3475 от 29 января 1999 года. Если это была ошибка, я серьезно сомневаюсь, что вы могли бы исправить это сейчас, не сломав ничего. - person Joshua Ulrich; 14.11.2013
comment
@ Арун, ты собираешься спросить, почему это так в одном из настоящих списков рассылки? Мне было бы интересно узнать ответ. - person Simon O'Hanlon; 14.11.2013
comment
@Арун, честь возможного жаркого в пламени принадлежит тебе. - person Simon O'Hanlon; 14.11.2013