在情节上,我如何保留套索选择和点击点的信息?

时间:2017-09-19 18:46:28

标签: r shiny plotly ggplotly

我正在使用plotly::ggplotly(),我需要用户能够选择单个点并使用刷子选择多个点。我希望两个选择选项并行存在。用户应该能够点击一个点并套索选择几个点,并且应该记录这两个信息。

我遇到的问题是,如果我点击一个点,那么套索选择会被重置。但事实恰恰相反:如果我套索选择然后点击一个点,那么两者都会被保留。

以下是此问题的GIF

这是我的代码:

library(shiny)
library(plotly)

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

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

  nms <- row.names(mtcars)

  output$plot <- renderPlotly({
    p <- ggplot(mtcars, aes(x = mpg, y = wt, key = nms)) + geom_point()
    ggplotly(p) %>% layout(dragmode = "lasso")
  })

  output$click <- renderPrint({
    d <- event_data("plotly_click")
    if (!is.null(d)) d
  })

  output$brush <- renderPrint({
    d <- event_data("plotly_selected")
    if (!is.null(d)) d
  })

}

shinyApp(ui, server)

重现:

  • 点击单个点
  • 做套索选择
  • 两者目前都可见
  • 点击其他点
  • 现在套索选择信息已经消失
  • 再次进行套索选择,两者都可见

1 个答案:

答案 0 :(得分:1)

如果您将event_data传递给renderPrint()函数之外的对象,这应该可行。如果删除下面突出显示的可选行,您还可以保留以前的套索/点击结果:

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

server <- function(input, output, session) {
    frame1 <- data.frame()
    frame2 <- data.frame()
    nms <- row.names(mtcars)

    output$plot <- renderPlotly({
        p <- ggplot(mtcars, aes(x = mpg, y = wt, key = nms)) + geom_point()
        ggplotly(p) %>% layout(dragmode = "lasso")
    })

    output$click <- renderPrint({
        d <- event_data("plotly_click")
        if (!is.null(d)) {
            frame1 <<- frame1[is.null(frame1$pointNumber), ] # Optional line to remove the previous selections
            frame1 <<- rbind(frame1, d) 
        }
            frame1
        })

    output$brush <- renderPrint({
        d <- event_data("plotly_selected")
        if (!is.null(d)) {
            frame2 <<- frame2[is.null(frame2$pointNumber), ] # Optional line to remove the previous selections 
            frame2 <<- rbind(frame2, d)
        }
            frame2

    })

}

shinyApp(ui, server)