将事件数据信息映射到Shiny无效图中的绘图信息

时间:2017-08-19 12:05:02

标签: r shiny shinydashboard shiny-reactivity

如何从even_data信息中检索用于绘图的原始数据?

library(plotly)
library(shiny)

ui <- fluidPage(
  plotlyOutput("plot"),
  verbatimTextOutput("click")
)

server <- function(input, output, session) {

  output$plot <- renderPlotly({
    key <- row.names(mtcars)
    p <- ggplot(mtcars, aes(x = mpg, y = wt, colour = factor(vs), key = key)) + 
        geom_point()
    ggplotly(p) %>% layout(dragmode = "select")

  })


  output$click <- renderPrint({
    d <- event_data("plotly_click")
    if (is.null(d)) "Click events appear here (double-click to clear)" else d
  })


}

shinyApp(ui, server)

单击某个点时,示例输出类似于

  curveNumber pointNumber    x    y       key
1           1           3 24.4 3.19 Merc 240D

有没有办法将这些信息映射到原始数据集mtcarscurveNumberpointNumber中的信息如何有用以及这些字段的含义是什么?

1 个答案:

答案 0 :(得分:1)

curveNumbercolour = factor(vs)变量,pointNumber是组内的行号+1(vs的0或1)。

因此,使用这两个,您可以执行以下操作:

library(plotly)
library(shiny)
library(dplyr)
ui <- fluidPage(
  plotlyOutput("plot"),
  verbatimTextOutput("click")
)
server <- function(input, output, session) {
  output$plot <- renderPlotly({
    key <- row.names(mtcars)
    p <- ggplot(mtcars, aes(x = mpg, y = wt, colour = factor(vs), key = key)) + 
      geom_point()
    ggplotly(p) %>% layout(dragmode = "select")
  })
  output$click <- renderPrint({
    d <- event_data("plotly_click")
    if (is.null(d)) "Click events appear here (double-click to clear)" else mtcars %>% tibble::rownames_to_column() %>% filter(vs==d$curveNumber) %>% filter(row_number()==d$pointNumber+1)

  })
}
shinyApp(ui, server)

或者,第二个选项,您需要从key和子集mtcars中提取event_data,如下所示:

output$click <- renderPrint({
    d <- event_data("plotly_click")
    if (is.null(d)) "Click events appear here (double-click to clear)" 
    else mtcars[rownames(mtcars) == d$key,]
  })

完整的应用:

library(plotly)
library(shiny)
ui <- fluidPage(
  plotlyOutput("plot"),
  verbatimTextOutput("click")
)
server <- function(input, output, session) {
  output$plot <- renderPlotly({
    key <- row.names(mtcars)
    p <- ggplot(mtcars, aes(x = mpg, y = wt, colour = factor(vs), key = key)) + 
      geom_point()
    ggplotly(p) %>% layout(dragmode = "select")
  })
  output$click <- renderPrint({
    d <- event_data("plotly_click")
    if (is.null(d)) "Click events appear here (double-click to clear)" else mtcars[rownames(mtcars) == d$key,]
  })
}
shinyApp(ui, server)