2017-02-20 32 views
0

Я хочу написать пользовательскую функцию вокруг plot_ly() в R. Таким образом, я могу сделать серию диаграмм рассеяния с помощью одинаковое форматирование и стиль, но не дублирующий код. I used this page as a guide. Этот код воспроизводит ошибку:Пользовательская функция R вокруг plot_ly() с установленной (lm (y ~ x)) с помощью add_lines()

library(plotly) 
my_plot <- function(x, y, ...) { 
    require(broom) 
    plot_ly(data = mtcars, y = y, x = x, showlegend = FALSE, ...) %>% 
    add_markers(y = y) %>% 
    add_lines(y = ~fitted(lm(y ~ x))) %>% 
    add_ribbons(data = augment(lm(y ~ x, data = mtcars)), 
       ymin = ~.fitted - 1.96 * .se.fit, 
       ymax = ~.fitted + 1.96 * .se.fit, 
       line = list(color = 'rgba(7, 164, 181, 0.05)'), 
       fillcolor = 'rgba(7, 164, 181, 0.2)', 
       name = "Standard Error") 
} 
my_plot(y = ~mpg, x = ~disp) 

Проблема заключается в следующем:

add_lines(y = ~fitted(lm(y ~ x))) %>% 

Я попытался с помощью as.formula(), но сообщение об ошибке аналогично.

add_lines(y = ~fitted(lm(as.formula("y ~ x"))) %>% 

Вот сообщение об ошибке:

Error in model.frame.default(formula = y ~ x, data = mtcars, drop.unused.levels = TRUE) : object is not a matrix

код работает, когда это не функция:

library(plotly) 
library(broom) 
plot_ly(data = mtcars, y = ~mpg, x = ~disp, showlegend = FALSE) %>% 
    add_markers(y = ~mpg) %>% 
    add_lines(y = ~fitted(lm(mpg ~ disp))) %>% 
    add_ribbons(data = augment(lm(mpg ~ disp, data = mtcars)), 
      ymin = ~.fitted - 1.96 * .se.fit, 
      ymax = ~.fitted + 1.96 * .se.fit, 
      line = list(color = 'rgba(7, 164, 181, 0.05)'), 
      fillcolor = 'rgba(7, 164, 181, 0.2)', 
      name = "Standard Error") 

ответ

0

Одна из возможностей будет проходить как dataframe и столбец имена вашей функции, например

library(plotly) 

my_plot <- function(data, x, y, ...) { 
    require(broom) 
    plot_ly(y = data[[y]], x = data[[x]], showlegend = FALSE, ...) %>% 
    add_markers(y = data[[y]]) %>% 
    add_lines(y = ~fitted(lm(data[[y]] ~ data[[x]]))) %>% 
    add_ribbons(data = augment(lm(data[[y]] ~ data[[x]])), 
       ymin = ~.fitted - 1.96 * .se.fit, 
       ymax = ~.fitted + 1.96 * .se.fit, 
       line = list(color = 'rgba(7, 164, 181, 0.05)'), 
       fillcolor = 'rgba(7, 164, 181, 0.2)', 
       name = "Standard Error") 
} 
my_plot(data = mtcars, y = 'mpg', x = 'disp') 

или только сами столбцы.

library(plotly) 

my_plot <- function(x, y, ...) { 
    require(broom) 
    plot_ly(y = y, x = x, showlegend = FALSE, ...) %>% 
    add_markers(y = y) %>% 
    add_lines(y = ~fitted(lm(y ~ x))) %>% 
    add_ribbons(data = augment(lm(y ~ x)), 
       ymin = ~.fitted - 1.96 * .se.fit, 
       ymax = ~.fitted + 1.96 * .se.fit, 
       line = list(color = 'rgba(7, 164, 181, 0.05)'), 
       fillcolor = 'rgba(7, 164, 181, 0.2)', 
       name = "Standard Error") 
} 
my_plot(y = mtcars$mpg, x = mtcars$disp)