2016-11-06 2 views
4

+ обычно выбрасывает non-numeric argument to binary operator при наличии чего-то другого, кроме числа. Но он работает с ggplot2, вставляя сюжет вместе. В то же время он сохраняет свою обычную функцию вне контекста ggplot2 (например, как оператор арифметики или формулы), поэтому его версия ggplot2 не противоречит ни одному из них.Как определяется оператор ggplot2 plus?

Я хочу понять, как сделать + так себя вести. Просмотрев ggplot2 github repo, я нашел определения функций для +.gg и %+%, но это не сделало меня более ясными.

Я был бы рад указателю на код в пакете ggplot2, который делает это, или обобщенное объяснение того, как это делается.

ответ

5

Если вы рассекать +.gg мы имеем:

> ggplot2:::`+.gg` 
function (e1, e2) 
{ 
    e2name <- deparse(substitute(e2)) 
    if (is.theme(e1)) 
    add_theme(e1, e2, e2name) 
    else if (is.ggplot(e1)) 
    add_ggplot(e1, e2, e2name) 
} 

Кроме того, add_theme, что вы заинтересованы в том, является add_ggplot, которые могут быть доступны с ggplot2:::add_ggplot. Последняя - длинная, но очень организованная функция - показывает больше «каскадных» функций для отправки того, что должно быть добавлено.

Это означает, что R «знает» при использовании «+» на объекте класса gg, который будет применяться (из-за S3 classes). Вы можете найти отправную точку в ggplot2 GitHub repos, в ggproto.R, на котором я думаю, что поведение большинства из ggplot2 зависит от.

Это вы что искали?

+0

Спасибо. Мне не ясно, что имя функции '+ .gg', но мы не используем' + .gg', мы используем просто '+'. Как R знает, чтобы называть '+ .gg', если это то, что происходит? – jakub

+1

Это из-за [S3 классов] (http://adv-r.had.co.nz/S3.html). И все, что является вызовом функции в R (try '+' (с кавычками)), 'ggplot2'" просто "расширяет метод' + 'до объекта класса' gg'. –

+0

Хм, увидев там '.', это должно было указывать мне в правильном направлении! Не могли бы вы узнать, где определение класса в репозитории ggplot2? – jakub