在 Shiny App 的另一部分从 ggplotly 中检索选定的点

Retrieve Selected Points from ggplotly in Another Part of Shiny App

期望的结果

我希望能够在我的 {shiny} 应用程序中单击 plotly::ggplotly() 图表中的一个点,然后在下面的单独输出中显示有关该点的一些信息。

MRE

在这个简单的示例中,我可以让它显示 curveNumberpointNumberxy,但明确检索特定数据点并不容易来自这些值的原始数据。我已经 read 关于在 plotly::renderPlotly() 调用中使用 key,尽管我不确定如何在应用程序的单独部分访问它。

library(tidyverse)
library(plotly)
library(shiny)

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

# server  ----
server <- function(input, output) {
  output$plot <- renderPlotly({
    
    p <- mtcars %>% 
      rownames_to_column("car") %>% 
      ggplot(aes(x = disp, y = mpg, color = factor(cyl),
                 label = car)) +
      geom_point(size = 4, alpha = 0.7)
    
    ggplotly(p) %>% 
      event_register("plotly_click")
  })
  
  output$click <- renderPrint({
    point <- event_data(event = "plotly_click", priority = "event")
    if (is.null(point)) "No Point Selected" else point
  })
}

# app ----
shinyApp(ui = ui, server = server)

使用 here 中的代码,我想出了如何使用 key 来识别点,然后从 event_data() 的其他地方检索它。

library(tidyverse)
library(plotly)
library(shiny)

d <-  mtcars %>% 
  rownames_to_column("car")

# UI  ----
ui <- fluidPage(plotlyOutput("plot"),
                tableOutput("click"))

# server  ----
server <- function(input, output) {
  output$plot <- renderPlotly({
    
    key <- d$car
    
    p <- d %>% 
      ggplot(aes(x = disp, y = mpg, color = factor(cyl),
                 key = key)) +
      geom_point(size = 4, alpha = 0.7)
    
    ggplotly(p) %>% 
      event_register("plotly_click")
  })
  
  output$click <- renderTable({
    point <- event_data(event = "plotly_click", priority = "event")
    req(point) # to avoid error if no point is clicked
    filter(d, car == point$key) # use the key to find selected point
  })
}

# app ----
shinyApp(ui = ui, server = server)