在闪亮的单选按钮 select 上有计划地重置 event_data

Resetting plotly event_data upon radio button select in shiny

我有一个闪亮的交互式显示文本,它从绘图中捕获点击事件。如果什么都没有点击,则显示默认文本,一旦点击一个点,就会显示其对应的值。

但是,我还有一个单选按钮 select 图中显示的内容。问题是,当我更改 selected 单选按钮时,交互式显示的文本不再正确,因为情节发生了变化并且没有被捕获,正如您在下面的简化示例中看到的那样。 因此,每当我 select 单选按钮中的不同选项时,我希望重置 event_data(并因此显示默认文本)。

我知道有一些方法可以创建一个单独的 'reset' 按钮(例如使用 shinyjs 包,请参阅 here),但我想知道是否有可能以某种方式耦合此重置单选按钮的功能。

library(ggplot2)      
library(shiny)          
library(shinydashboard) 
library(plotly)     

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(
      box(plotlyOutput("first"),
          radioButtons("radbut", "Choose:", c("Sepal" = "sepal","Petal" = 
"petal")) 
      ),
      box(textOutput("second"))
    )
  )
)

server <- function(input, output, session) {
  output$first <- renderPlotly({
    if (input$radbut == "sepal") {
      gp <- ggplot(data = iris, aes(x = Sepal.Width, y = Sepal.Length)) +
        geom_point()
    } else {
      gp <- ggplot(data = iris, aes(x = Petal.Width, y = Petal.Length)) +
        geom_point()  
    }
    ggplotly(gp, source = "select")
  })
  output$second <- renderText({
    clicked <- event_data("plotly_click", source = "select")
    if (is.null(clicked)) {
      text = "Select a value"
    } else {
      text = paste("You clicked:", input$radbut, 
                   clicked[[3]],",", clicked[[4]], sep = " ")
    }
    text
  })
}

shinyApp(ui, server)

这是一个使用反应值的可能解决方案(解决方法)。我认为我必须有一个更优雅的解决方案,但找不到它。

希望对您有所帮助!

    library(ggplot2)      
    library(shiny)          
    library(shinydashboard) 
    library(plotly)     

    ui <- dashboardPage(
            dashboardHeader(),
            dashboardSidebar(),
            dashboardBody(
                    fluidRow(
                            box(plotlyOutput("first"),
                                radioButtons("radbut", "Choose:", c("Sepal" = "sepal","Petal" = 
                                                                            "petal")) 
                            ),
                            box(textOutput("second"))
                    )
            )
    )

    server <- function(input, output, session) {
            defaults <- reactiveValues(part = "Sepal", text = "")
            output$first <- renderPlotly({
                    defaults$text = "Select a value"

                    if (input$radbut == "sepal") {
                            defaults$part = "Sepal"

                            gp <- ggplot(data = iris, aes(x = Sepal.Width, y = Sepal.Length)) +
                                    geom_point()
                    } else {
                            defaults$part = "Petal"
                            gp <- ggplot(data = iris, aes(x = Petal.Width, y = Petal.Length)) +
                                    geom_point()  
                    }
                    ggplotly(gp, source = "select")
            })
            clicked <- reactive({
                    event_data("plotly_click", source = "select")
            })
            observeEvent(clicked(), {
                    defaults$text = paste("You clicked:", defaults$part, 
                                 clicked()[[3]],",", clicked()[[4]], sep = " ")
            })
            output$second <- renderText({
                    defaults$text
            })
    }

    shinyApp(ui, server)