Построение add_trace из функции: Plotly - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь «функционализировать» свои сюжетные утверждения.Если я хочу добавить дополнительную трассировку из другого фрейма данных, я получаю сообщение об ошибке, что значения на оси y не равны первому числу значений в первом фрейме данных.Я не уверен, почему это актуально.

library(tidyverse)
library(plotly) 
library(lubridate)

Date <- seq(as.Date("2016-10-1"), as.Date("2018-09-01"), by="month")
Values <- c(2,3,4,3,4,5,6,4,5,6,7,8,9,10,8,9,10,11,12,13,11,12,13,14)

Date2 <- seq(as.Date("2018-07-1"), as.Date("2018-09-01"), by="month")
Values2 <- c(16,17,18)

df <- tibble::tibble(Date, Values)
df2 <- tibble::tibble(Date2, Values2)



testfunction <- function(x, y, y2){

p <-  plot_ly(df,x = ~x, y = ~y, colors = "Blues", type = 'scatter', mode = 'lines') %>% 
     add_trace(data = df2, y = ~y2, line = list(color = 'rgb(255, 36,1)', width = 2.25)) %>% 
     layout(xaxis = list(tickformat = "%b %e"))

      p  
}

testfunction(Date, Values, Values2)

#Error: Column `y` must be length 1 or 24, not 3

1 Ответ

0 голосов
/ 22 сентября 2018

Обратите внимание, что Date, Values и Values2 являются объектами, которые существуют в вашей глобальной среде.Таким образом, testfunction фактически использует эти объекты при вызове plot_ly.Чтобы продемонстрировать это, попробуйте удалить df в вызове plot_ly - вы все равно сможете получить график (т. Е. plot_ly фактически не использует значения в кадре данных).Однако я подозреваю, что вы пытаетесь указать имена переменных в вашем фрейме данных в аргументах вашей функции.В этом случае попробуйте

testfunction <- function(x, y, x2, y2) {
  x <- enquo(x)
  y <- enquo(y)
  x2 <- enquo(x2)
  y2 <- enquo(y2)
  plot_ly(df, x = x, y = y, type = "scatter", mode = "lines") %>%
    add_trace(x = x2, y = y2, data = df2)
}

testfunction(Date, Values, Date2, Values2)

с подсказкой к этому вопросу и ответьте: Передайте переменные в качестве параметров функции plot_ly

...