我正在使用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)
重现:
答案 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)