2

我想nearPoints使用点击事件中的数据来获取。

我从Shiny 网页中找到了以下代码段,它按预期工作得很好。

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
})

我试图模仿上述方法来nearPoints使用点击事件数据识别 Plotly 图中的 。但是,它没有用。

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
})

关于如何将坐标信息传递给情节图的任何想法?

4

2 回答 2

2

我不确定如何使用 nearPoints 函数执行此操作,但真的有必要使用该函数吗?您也可以使用以下代码找到在单击点阈值内的点:

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)
    })
  }
)

希望这可以帮助。

于 2017-08-08T14:52:21.630 回答
1

"plotly_selected"plotly.js 事件返回的信息比event_data("plotly_selected")实际提供的更多,包括坐标信息(可以说这是一个设计错误event_data(),因为太晚了,无法更改)。幸运的是,如果你懂一点 JavaScript,知道如何监听情节选择事件,以及如何将数据从客户端发送到闪亮的服务器,你可以执行以下操作来访问该信息:

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)

使用坐标信息,您可以编写一个与nearPoints().

于 2017-08-08T17:34:49.973 回答