使用动态输入字段以图解方式显示交互式图表

时间:2019-02-18 11:27:42

标签: r shiny r-plotly

我正在尝试创建一个具有下拉菜单的图表,用户可以在其中选择要在图表上显示的内容(例如Power BI图表中的“过滤器”,但我想保留在R中)。因此,我将继续使用Shiny和Plotly(欢迎其他任何建议!)。

大多数教程都指向对输入选择进行硬编码,但是我有成千上万个选择,因此我希望此列表是从数据源中的字段动态生成的。这是到目前为止的示例,我希望下拉菜单允许用户在Home 1和Home 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 :(得分:1)

这是我的处理方法:

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)创建一个反应性(过滤后的)数据集