Updating multiple infobox using plotly_click in R and plotly

天大地大妈咪最大 提交于 2019-12-13 20:16:26

问题


If you please run the script, it gives you a basic Sankey Chart in R and plotly and a data table besides. Also, there are three infoBoxes on top. When I click on the Sankey lines in the plot, I see the value in the data table using plotly_click. I want a functionality when I click on any Sankey Line, it picks "pointNumber" Column value in the data table and then multiplies by 2 and put in first infobox, by 3 in second infobox, and multiply by 4 in third infobox as in the snap attached. Thanks and please help.

## app.R ##
library(shiny)
library(shinydashboard)
library(devtools)
library(ggplot2)
library(plotly)
library(proto)
library(RColorBrewer)
library(gapminder)
library(stringr)
library(broom)
library(mnormt)
library(DT)

ui <- dashboardPage(
dashboardHeader(title = "Multiple hover"),
dashboardSidebar(
width = 0
),
dashboardBody(

infoBox("Multiply by 2", 2 * 2, icon = icon("credit-card")),
infoBox("Multiply by 3", 2 * 3, icon = icon("credit-card")),
infoBox("Multiply by 4", 2 * 4, icon = icon("credit-card")),
tags$br(),

box(title = "Sankey Chart", status = "primary",height = "455" ,solidHeader = 
T,
plotlyOutput("sankey_plot")),

box( title = "Case Summary", status = "primary", height = "455",solidHeader 
= T, 
     dataTableOutput("sankey_table"))
)
)
server <- function(input, output) 
{ 
output$sankey_plot <- renderPlotly({
trace1 <- list(
  domain = list(
    x = c(0, 1), 
    y = c(0, 1)
  ), 
  link = list(
    label = c("Case1", "Case2", "Case3", "Case4", "Case5", "Case6", 
  "Case7"), 
    source = c(0, 1, 2, 3, 4, 5, 6, 7), 
    target = c(11, 12, 7, 10, 13, 9, 8), 
    value = c(5, 6, 2, 4, 10, 6, 2)
  ), 
  node = list(label = c("R1", "R2", "R3","R4","R5","R6","R7","Blood 
  Test","Check Out","Discuss Results",
                        "MRI Scan", "Registration", "Triage and Assessment", 
  "X-RAY")), 
  type = "sankey"
  )
  data <- list(trace1)
  p <- plot_ly()
  p <- add_trace(p, domain=trace1$domain, link=trace1$link, 
  node=trace1$node, type=trace1$type)
  p
  })
  output$sankey_table <- renderDataTable({
  d <- event_data("plotly_click")
  if(is.null(d)) 
  {
  print("Hello, Please hover to see the result" )
  } else 
  d
  })
  }
  shinyApp(ui, server)


回答1:


Considering event_data() outputs a dataframe, the below code access that particular value pointNumber and renders dynamic UI.

Code:

## app.R ##
library(shiny)
library(shinydashboard)
library(devtools)
library(ggplot2)
library(plotly)
library(proto)
library(RColorBrewer)
library(gapminder)
library(stringr)
library(broom)
library(mnormt)
library(DT)

ui <- dashboardPage(
  dashboardHeader(title = "Multiple hover"),
  dashboardSidebar(
    width = 0
  ),
  dashboardBody(

    uiOutput('box1'),
    tags$br(),

    box(title = "Sankey Chart", status = "primary",height = "455" ,solidHeader = 
          T,
        plotlyOutput("sankey_plot")),

    box( title = "Case Summary", status = "primary", height = "455",solidHeader 
         = T, 
         dataTableOutput("sankey_table"))
  )
)
server <- function(input, output) 
{ 
  output$sankey_plot <- renderPlotly({
    trace1 <- list(
      domain = list(
        x = c(0, 1), 
        y = c(0, 1)
      ), 
      link = list(
        label = c("Case1", "Case2", "Case3", "Case4", "Case5", "Case6", 
                  "Case7"), 
        source = c(0, 1, 2, 3, 4, 5, 6, 7), 
        target = c(11, 12, 7, 10, 13, 9, 8), 
        value = c(5, 6, 2, 4, 10, 6, 2)
      ), 
      node = list(label = c("R1", "R2", "R3","R4","R5","R6","R7","Blood 
                            Test","Check Out","Discuss Results",
                            "MRI Scan", "Registration", "Triage and Assessment", 
                            "X-RAY")), 
      type = "sankey"
    )
    data <- list(trace1)
    p <- plot_ly()
    p <- add_trace(p, domain=trace1$domain, link=trace1$link, 
                   node=trace1$node, type=trace1$type)
    p
  })
  output$sankey_table <- renderDataTable({
    d <- event_data("plotly_click")
    if(is.null(d)) 
    {
      print("Hello, Please hover to see the result" )
    } else 
      d
  })

  output$box1 <- renderUI({
   tagList(

     infoBox("Multiply by 2", event_data("plotly_click")$pointNumber * 2, icon = icon("credit-card")),
     infoBox("Multiply by 3", event_data("plotly_click")$pointNumber * 3, icon = icon("credit-card")),
     infoBox("Multiply by 4", event_data("plotly_click")$pointNumber * 4, icon = icon("credit-card")) 
   )


  })

}
shinyApp(ui, server)

Screenshot:



来源:https://stackoverflow.com/questions/47018157/updating-multiple-infobox-using-plotly-click-in-r-and-plotly

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!