如何重置selectInput或observeEvent?

ovfsdjhp  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(110)

当我打开一个modalDialog(通过点击一个"modal"按钮),里面有一个selectInput时,列表的第一个选择会显示出来,observeEvent会自动启动这个第一个元素。
如果我选择列表中的第二个元素,observeEvent会再次启动,这是正确的。
我"取消"或"关闭" modalDialog,然后通过单击主窗口中的"modal"按钮再次打开它。
列表中的第一个选项会再次显示,observeEvent会自动使用第一个元素启动。
现在我"取消"或"解散"这个modalDialog,而不选择selectInput的任何元素。
如果我再次打开modalDialog,什么也不会发生,因为第一个选择与我之前关闭modelDialog时相同,所以observeEvent没有检测到任何更改,因此它不会启动操作。
是否有办法重置selectInput或observeEvent,以便在modalDialog关闭时"忘记"先前选择的元素?即使selectInput仅包含一个选项,也必须这样做。
我尝试在modalDialog的页脚中添加一个actionButton,以便在关闭时启动一个操作:它用一个假值更新selectInput,但我不认为这是一个好方法...
这是一个可复制的代码,我设置了selectInput只有一个选择...
删除updateSelectInput前面的#以测试我的变通方案。
谢谢!

library(shiny)

ui <- fluidPage(
  actionButton("open", "Modal")
)

server <- function(input, output, session) {
  observeEvent(input$open, {
    showModal(
      modalDialog(
        tagList(
          div(id="choice",
              selectInput(
                "dateList", "History:",
                choices = c("choice1")
              )
          )
        )
        ,
        footer = tagList(
          actionButton("cancel","CANCEL"),
          actionButton("save", "SAVE")
        )
      )
    )
  })
  
  observeEvent( input$dateList,{
    insertUI("#choice", ui=div("hello"))
  })
   
  observeEvent( input$cancel,{
    removeModal()   
    #updateSelectInput(session, "dateList" , choices = c("fake"), selected = NULL)
  })
}

shinyApp(ui, server)
6g8kf2rb

6g8kf2rb1#

有意思。这里有一个方法,但我不是很喜欢它,因为它会生成一个JavaScript警告。但不用担心,这个警告是无害的。
其思想是使用对input$datelistinput$cancel都起作用的无功值。

reacVal <- eventReactive(list(input$dateList, input$cancel), {
    runif(1)
  })
  
  observeEvent(reacVal(), {
    insertUI("#choice", ui = div("hello"))
  })
  
  observeEvent(input$cancel, {
    removeModal() 
  })

该警告是由于按下取消按钮时没有div #choice这一方面引起的。

编辑

这里有一个更好的方法。没有警告,更清楚。我"重置" input$dateList,方法是在单击取消按钮时将其设置为NULL,在此按钮的onclick属性中使用一些JavaScript。

observeEvent(input$open, {
    showModal(
      modalDialog(
        tagList(
          div(id="choice",
              selectInput(
                "dateList", "History:",
                choices = c("choice1", "choice2")
              )
          )
        )
        ,
        footer = tagList(
          actionButton(
            "cancel", "CANCEL",
            onclick = "Shiny.setInputValue('dateList', null);"
          ),
          actionButton("save", "SAVE")
        )
      )
    )
  })
  
  observeEvent(input$dateList, {
    insertUI("#choice", ui = div("hello"))
  })
  
  observeEvent(input$cancel, {
    removeModal() 
  })

我选择NULL是因为观察者不会对NULL做出React(默认情况下),这就是为什么前面的警告不会在这里出现。

相关问题