如何在R Shiny中显示来自plotly_click的多个点?

3

我在R Shiny中有一个Plotly图。 我希望能够单击多个点并将它们显示在表格中。该图正在很好地工作,并且我可以通过event_data()获取1个plotly_click,以在表格中显示。如何增加许多event_data点的向量。这是一些示例代码。 我试图将事件保存在d_save中。谢谢。

library(shiny)
library(plotly)

data1 <- data.frame(cbind(seq(1,1000,1),seq(1,1000,1)*5))
colnames(data1) <- c('index','data')
data_points <- data.frame(cbind(seq(1,1000,5),seq(1,1000,5)*5))
colnames(data_points) <- c('index','data')


ui <- fluidPage(
  plotlyOutput("plot1"),
  tableOutput("dataTable")
)

d_save <- vector()

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

  # make plotly plot
  output$plot1 <- renderPlotly({
    p <- plot_ly(data1, x = data1$index, y = data1$data,mode = "lines")
    add_trace(p, x = data_points$index, y = data_points$data, mode = "markers")
  })

    # show table of stances 
    output$dataTable <- renderTable({
      d <- event_data("plotly_click")
      d_save <- c(d_save,d$pointNumber[2]+1)
      data.frame(d_save)
    })
}

shinyApp(ui, server)
1个回答

5

这段代码没有什么大问题,奇怪的是它从未得到回答。这不是一个使用ggplot的纯plotly的坏例子。

我通过以下方式进行了修复:

  • d_save <- c(...)分配更改为d_save <<- c(...)(在此处使用reactiveValues会更清洁)。
  • 将plotly调用更改为管道,似乎可以使一些设置保留下来(如type=scatter默认值),消除警告:

未指定跟踪类型:根据提供的信息,似乎适合“散点”跟踪。

  • 修复了d_save分配中的“off-by-one”索引错误。
  • 添加了layout(...)以给它一个标题(这对很多事情都有用)。

结果代码:

library(shiny)
library(plotly)

data1 <- data.frame(cbind(seq(1,1000,1),seq(1,1000,1)*5))
colnames(data1) <- c('index','data')
data_points <- data.frame(cbind(seq(1,1000,5),seq(1,1000,5)*5))
colnames(data_points) <- c('index','data')

ui <- fluidPage(
  plotlyOutput("plot1"),
  tableOutput("dataTable")
)

d_save <- vector()

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

  # make plotly plot
  output$plot1 <- renderPlotly({
    plot_ly(data1, x=data1$index, y=data1$data,mode = "lines") %>%
         add_trace(x = data_points$index, y=data_points$data, mode = "markers") %>%
         layout(title="Plotly_click Test")
  })

  # show table of point markers clicked on by number
  output$dataTable <- renderTable({
    d <- event_data("plotly_click")
    d_save <<- c(d_save,d$pointNumber[1]+1)
    data.frame(d_save)
  })
}
shinyApp(ui, server)

这张图片:

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接