如何同步在闪亮的应用程序中的绘图中向用户显示的选定点和向服务器显示的选定点?

问题描述 投票:0回答:1

我有一个应用程序,其中突出显示绘图中的点会改变另一个绘图中的行为。但是,您也可以通过更改一些 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 次(所以通常双击是不够的),然后有时它会起作用。其他人也有这样的经历吗?

r shiny plotly
1个回答
0
投票

您可以使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.