Shiny error while using nearPoints in renderPlotly click event

早过忘川 提交于 2021-01-27 21:11:24

问题


I would like to fetch nearPoints using the data from a click event.

I have found the below snippet from the Shiny webpage and it works fine as expected.

output$plot <- renderPlot({
  d <- data()
  plot(d$speed, d$dist)
})

output$plot_clickedpoints <- renderPrint({
  # For base graphics, we need to specify columns, though for ggplot2,
  # it's usually not necessary.
  res <- nearPoints(data(), input$plot_click, "speed", "dist")
  if (nrow(res) == 0)
    return()
  res
})

I tried to mimic the above the approach to identify the nearPoints in the Plotly plots using the click event data. However, it did not work.

output$plot <- renderPlotly({
  d <- data()
  plot(d$speed, d$dist)
})

output$plot_clickedpoints <- renderPrint({
  # For base graphics, we need to specify columns, though for ggplot2,
  # it's usually not necessary.
  res <- nearPoints(data(), event_data("plotly_click"), "speed", "dist")
  if (nrow(res) == 0)
    return()
  res
})

Any idea on how to pass the coordinate information to the plotly plot?


回答1:


I am not sure on how to do this with the nearPoints function, but is using that function really necessary? You could find the points that are within a threshold of the clicked point as well with the following code:

library(shiny)
library(plotly)
library(DT)

threshold_mpg = 3
threshold_cyl = 1

shinyApp(

  ui <- shinyUI(
    fluidPage(
      plotlyOutput("plot"),
      DT::dataTableOutput("table")
    )
  ),
  function(input,output){

    data <- reactive({
      mtcars
    })

    output$plot <- renderPlotly({
      d <- data()
      plot_ly(d, x= ~mpg, y=~cyl, mode = "markers", type = "scatter", source="mysource")
    })

    output$table<- DT::renderDataTable({

      event.data <- event_data("plotly_click", source = "mysource")
      print(event.data)
      if(is.null(event.data)) { return(NULL)}

      # A simple alternative for the nearPoints function
      result <- data()[abs(data()$mpg-event.data$x)<=threshold_mpg & abs(data()$cyl-event.data$y)<=threshold_cyl, ]
      DT::datatable(result)
    })
  }
)

Hope this helps.




回答2:


The "plotly_selected" plotly.js event returns more information than event_data("plotly_selected") actually gives you, including coordinate information (this was arguably a design mistake made by event_data() that's too late to change). Fortunately, if you know a bit of JavaScript, know how to listen to plotly select events, and how to send data from client to a shiny server, you can do something like this to access that info:

library(shiny)
library(plotly)
library(htmlwidgets)

ui <- fluidPage(
  plotlyOutput("p"),
  verbatimTextOutput("info")
)

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

  output$p <- renderPlotly({
    plot_ly(x = 1:10, y = 1:10) %>%
      layout(dragmode = "select") %>%
      onRender(
       "function(el, x) {
         var gd = document.getElementById(el.id);
         gd.on('plotly_selected', function(d) {
            // beware, sometimes this event fires objects that can't be seralized
            console.log(d);
            Shiny.onInputChange('my-select-event', d.range)
         })
       }")
  })


  output$info <- renderPrint({
    print(session$rootScope()$input[["my-select-event"]])
  })

}

shinyApp(ui, server)

Using the coordinate information you could write a function that works in a similar way to nearPoints().



来源:https://stackoverflow.com/questions/45525310/shiny-error-while-using-nearpoints-in-renderplotly-click-event

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