我有一个应用程序,其中突出显示绘图中的点会改变另一个绘图中的行为。但是,您也可以通过更改一些 selectInputs 来更改绘图。
现在不方便的是,在绘图更新后,用户在绘图中不再可见其中的选择,但 R 仍然认为正式选择的点仍然被选择。我该怎么做才能使用户和服务器(即plotlyplot 和 R)始终拥有有关所选点的相同信息?
请参阅我的最小示例:
library(shiny)
library(ggplot2)
library(plotly)
ui <- fluidPage(
plotlyOutput("po"),
selectInput("x", "x axis", names(iris)[1:4]),
selectInput("y", "y axis", names(iris)[1:4]),
verbatimTextOutput("vo")
)
server <- function(input, output, session) {
output$po <- renderPlotly({
p <- ggplot(iris) + geom_point(aes(.data[[input$x]], .data[[input$y]], color=Species))
p <- ggplotly(p, source = "iris")
p <- layout(p, dragmode = "lasso")
p
})
output$vo <- renderPrint({
event_data("plotly_selected", source = "iris")
})
}
shinyApp(ui, server)
当您使用套索选择点时,renderPrint 会显示您所选择的内容。当您更改坐标时,renderPrint 保持不变,但绘图没有任何选择。
纠正这个问题最简单的方法是什么? 两种明显的解决方案都可以:
ploty_selected
设置回 NULL。最好以某种方式,这样就没有必要重建情节所依赖的内容。我个人认为这种行为应该被视为一个错误,尽管我可能会错过一些东西。
我有一个额外的问题:我真的不明白如何重置选择:对我来说,似乎我必须非常快地单击大约 10 次(所以通常双击是不够的),然后有时它会起作用。其他人也有这样的经历吗?
您可以使用
shinyjs
进行重置。试试这个
library(shiny)
library(ggplot2)
library(plotly)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
actionButton("reset", "Reset"),
plotlyOutput("po"),
selectInput("x", "x axis", names(iris)[1:4]),
selectInput("y", "y axis", names(iris)[1:4]),
verbatimTextOutput("vo")
)
server <- function(input, output, session) {
myplot <- eventReactive(c(input$reset,input$x,input$y), {
p <- ggplot(iris) + geom_point(aes(.data[[input$x]], .data[[input$y]], color=Species))
p <- ggplotly(p, source = "iris")
p <- layout(p, dragmode = "lasso")
p
})
output$po <- renderPlotly({ myplot()
# p <- ggplot(iris) + geom_point(aes(.data[[input$x]], .data[[input$y]], color=Species))
# p <- ggplotly(p, source = "iris")
# p <- layout(p, dragmode = "lasso")
# p
})
observeEvent(input[["reset"]], {
runjs("Shiny.setInputValue('plotly_selected-iris', null);")
})
output$vo <- renderPrint({
event_data("plotly_selected", source = "iris")
})
}
shinyApp(ui, server)