【问题标题】:How do I make a Shiny reset button that resets input values then updates data?如何制作一个闪亮的重置按钮来重置输入值然后更新数据?
【发布时间】:2021-09-16 16:47:54
【问题描述】:

我有一个应用程序,它背后有大量数据,以及一套过滤器,用户可以应用这些过滤器对数据进行切片和切块,并获得一系列输出。

由于数据集的大小,每次选择过滤器时,在 R 处理新过滤的数据时都会有一个可以理解的延迟。因此,我实现了一个“更新模型”按钮,它可以一次应用所有更改(而不是在选择过滤器时单独应用,因为所有滞后都会累加)。

我还有一个重置按钮,可以一次完全重置所有过滤器。理想情况下,此按钮的行为是首先将所有输入值更新为其默认值,然后更新数据,以便使用默认值更新所有输出(即相当于手动选择默认值和然后按“更新”按钮)。两个按钮都会增加一个观察到的反应值并触发数据更新,唯一的区别是当按下重置按钮时,输入值首先重置(理论上),然后观察到的反应值增加。

但是,当按下重置按钮时,值会重置,但无功输出不会更新。然后必须按下更新按钮(或再次按下重置按钮)以更新输出。似乎正在发生的事情是在触发数据更新后重置值,因此新重置的值不会通过。

我尝试过在 observeEvent 函数中使用优先级值,并将 UI 移动到服务器内的 renderUI 函数。我还使用了 bindEvent 来尝试确保数据更新发生在重置之后。

编辑:我不能使用 jpdugo17 明智地建议的session$reload(),因为该应用程序有多个页面,我只想重置当前页面上的过滤器。

原始应用程序不实用,但我使用具有相同逻辑(或缺少逻辑!)的默认 Shiny 编写了一个解决问题的脚本,尽管它缺少像真实应用程序那样具有多个页面的导航栏结构:

app.R

library(shiny)

ui <- fluidPage(
    titlePanel("Old Faithful Geyser Data"),
    sidebarLayout(
        sidebarPanel(
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 50,
                        value = 30),
            actionButton("reset","RESET"),
            actionButton("update","UPDATE")
        ),
        mainPanel(
           plotOutput("distPlot")
        )
    )
)

server <- function(input, output,session) {
# Create values to use control the reset/update function
dat <- reactiveValues(bins=30,push_update=0)

# When reset button is pressed, reset the slider value and send a 'push update' signal
observeEvent(input$reset,{
    updateSliderInput(session=session,"bins",value=30)
    dat$push_update=dat$push_update+1
})

# When update button is pressed, send a 'push update' signal
observeEvent(input$update,{
    dat$push_update=dat$push_update+1
})

# When a 'push update' is received update the value used in the model  
observeEvent(dat$push_update,{
    dat$bins <- input$bins
})

output$distPlot <- renderPlot({
    x    <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = dat$bins + 1)

    hist(x, breaks = bins, col = 'darkgray', border = 'white')


 })
    
}

shinyApp(ui = ui, server = server)

我希望有一种方法可以实现,包括重置和更新按钮。任何帮助将不胜感激。我知道还有许多其他问题涉及重置按钮,但我看不到任何适合此问题的问题。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    actionButton() 函数有一个内部值,每次按下它都会增加 1。对于重置应用程序,如果您不需要保存其他选项卡,我可以考虑使用session$reload()。如果只有部分 ui 需要重置,那么您可以在 observeEvent 中调用 renderUI

    最后,对于更新按钮,我们可以使用输入值,但 isolate 它们是触发更新的唯一方法是单击按钮,在这种情况下不更改滑块。

    library(shiny)
    
    tab1_ui <- tagList(
      sidebarLayout(
        sidebarPanel(
          sliderInput("bins",
                      "Number of bins:",
                      min = 1,
                      max = 50,
                      value = 30),
          actionButton('reset', 'RESET'),
          actionButton("update","UPDATE"),
        ),
        mainPanel(
          plotOutput("distPlot")
        ) )
    )
    
    ui <- navbarPage(
      title = "Old Faithful Geyser Data",
      tabPanel('Tab 1',
               uiOutput('tab_1_ui')),
      tabPanel('Tab 2',
               selectInput('iris_nms', 'Select Column', names(iris)))
    )
    
    server <- function(input, output,session) {
      
      #show the ui at the start of the app.
      output$tab_1_ui <- renderUI({
        tab1_ui
      })
      
      # When reset button is pressed, reset the slider value and send a 'push update' signal
      observeEvent(input$reset,{
        output$tab_1_ui <- renderUI({
          tab1_ui
        })
      })
      
      # When update button is pressed, send a 'push update' signal
      observe({
        input$update
        input$reset
        output$distPlot <- renderPlot({
          x    <- faithful[, 2]
          bins <- seq(min(x), max(x), length.out = isolate(input$bins[1]))
          hist(x, breaks = bins, col = 'darkgray', border = 'white')
        })
        
      })
      
      
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 感谢您的建议。这当然适用于示例,但是在实际应用程序中,导航栏中排列了多个页面,因此我不想重新初始化应用程序,只是有效地刷新它所在的页面。
    • @QuillStem 我编辑了答案以考虑标签大小写。
    • 谢谢 - 我已经成功地适应了我的问题。
    猜你喜欢
    • 2019-06-18
    • 2020-08-12
    • 2021-07-11
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2021-12-05
    • 2020-06-23
    相关资源
    最近更新 更多