Интерактивные диаграммы с использованием динамических полей ввода - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь создать диаграмму с раскрывающимся списком, в которой пользователь может выбрать, что отображать на диаграмме (например, «фильтр» на диаграмме Power BI, но я хочу остаться в R).Так что я иду с Shiny и Plotly (любые другие предложения приветствуются!).

Большинство уроков указывают на жесткое кодирование входных выборок, но у меня есть тысячи выборок, поэтому я хочу, чтобы этот список создавался динамически из поля в моем источнике данных.Вот пример того, куда я дошел, я хочу, чтобы раскрывающийся список позволял пользователю выбирать между Домом 1 и Домом 2:

library(shiny)
library(plotly)

df <- data.frame(Name = c("Home 1", "Home 1", "Home 2", "Home 2"), Rating = c("Good", "Excellent", "Good", "Good"),
                     Date = c("2016-07-14", "2016-08-14", "2016-07-14", "2016-08-14"))


# Get a basic shiny app working with dropdowns
ui <- fluidPage(
  plotlyOutput("plot"),
  selectInput(df$Name, "Select Name", df$Name),
  verbatimTextOutput("event")
)

server <- function(input, output) { 
  output$plot <- renderPlotly({
    plot_ly(df, x = df$Date, y = df$Rating, type = 'scatter', mode = 'line')
  })

  output$event <- renderPrint({
    d <- event_data("plotly_hover")
    if (is.null(d)) "Hover on a point!" else d
  })
}

shinyApp(ui, server)

Я не знаю, куда поместить выбранный вход изselectInput() в функцию plot_ly(), так что этот код, очевидно, генерирует кучу предупреждений и не работает.

Warning in if (!is.na(attribValue)) { :
  the condition has length > 1 and only the first element will be used
Warning in charToRaw(enc2utf8(text)) :
  argument should be a character vector of length 1
all but the first element will be ignored

Я чувствую, что я близко, но я измотан и в основном нуждаюсь в ком-тогораздо лучше, чем я, чтобы указать мне правильное направление.

Или есть ли лучший способ использовать пакеты, кроме блестящих и сюжетных?

Спасибо

1 Ответ

0 голосов
/ 18 февраля 2019

Вот как я подхожу к этому:

library(shiny)
library(plotly)

df <- data.frame(Name = c("Home 1", "Home 1", "Home 2", "Home 2"), Rating = c("Good", "Excellent", "Good", "Good"),
                 Date = c("2016-07-14", "2016-08-14", "2016-07-14", "2016-08-14"))

# Get a basic shiny app working with dropdowns
ui <- fluidPage(
  plotlyOutput("plot"),
  selectInput("SelectName", "Select Name", df$Name, selected = unique(df$Name), multiple = TRUE),
  verbatimTextOutput("event")
)

server <- function(input, output) { 

  filteredDf <- reactive({
    req(input$SelectName)
    df[df$Name %in% input$SelectName, ]
  })

  output$plot <- renderPlotly({
    plot_ly(filteredDf(), x = ~Date, y = ~Rating, type = 'scatter', mode = 'line', color = ~Name)
  })

  output$event <- renderPrint({
    d <- event_data("plotly_hover")
    if (is.null(d)) "Hover on a point!" else d
  })
}

shinyApp(ui, server)

Вам нужно будет создать реактивный (отфильтрованный) набор данных из вашего df (который я назвал filteredDf)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...