定期禁用 updateSelectInput()

Posted

技术标签:

【中文标题】定期禁用 updateSelectInput()【英文标题】:Periodcally disable updateSelectInput() 【发布时间】:2019-04-17 05:35:37 【问题描述】:

我有一个应用程序,它有几个依赖的 selectInputs,所以如果你在第一个中选择一些东西,第二个应该更新为一个特定的值。这很好用。然而!现在我想对与更新逻辑不对应的两个选择强制进行特定组合,但是在我更新两个选择之后,第一个的更改会触发另一个的更新,我最终得到了错误的结果。同样在应用强制组合后,如果对第一个选择进行了新的更改,则应重新应用“旧”规则。

library(shiny)
ui <- fluidPage(

 selectInput("A_sel","select" ,c("A","B","C","D"),"A",FALSE)
,selectInput("B_sel","same"   ,c("A","B","C","D"),"A",FALSE)
,actionButton("ForceCombi","force C and D")
)

server <- function(input, output, session) 

observeEvent(input$A_sel,
updateSelectInput(session,"B_sel",selected = input$A_sel)
)

observeEvent(input$ForceCombi,
updateSelectInput(session,"A_sel",selected = "C")
updateSelectInput(session,"B_sel",selected = "D")
)



shinyApp(ui, server)

编辑 - 计时器解决方案: 我为每个激活设置了一个时间戳,看看哪个是最后一个被激活的,除非时间差小于一秒,那么我假设按下了激活选择的按钮。然后该反应的返回决定如何更新选择。有点小技巧:

library(shiny)
library(dplyr)

ui <- fluidPage(
   selectInput("A_sel","select",c("A","B","C","D"),"A",FALSE)
  ,selectInput("B_sel","same as above",c("A","B","C","D"),"A",FALSE)
  ,actionButton("A_to_B","force C and D")
)

server <- function(input, output, session) 

  but <- eventReactive(input$A_to_B,tibble(src = "but", time = Sys.time()))
  sel <- eventReactive(input$A_sel ,tibble(src = "sel", time = Sys.time()))

  src <- eventReactive(c(input$A_to_B,input$A_sel),
            df <- try(rbind(but(),sel()))

            if(typeof(df) == "character") return("sel")

            if(abs(difftime(df$time[1],df$time[2],units = "sec")) < 1) return("but")

            df %>% arrange(time) %>% pull(src) %>% last -> df
            return(df)
  )


  observe(
    src <- src()

    if(src == "sel") 
        updateSelectInput(session,"B_sel",selected = input$A_sel)
     else if (src == "but") 
        updateSelectInput(session,"A_sel",selected = "C")
        updateSelectInput(session,"B_sel",selected = "D")
    
)




shinyApp(ui, server)

【问题讨论】:

您可以创建一个反应变量作为指标,并仅在该特定事件上更新它。然后创建一个观察语句,它将检查反应变量并相应地切换您的选择输入。 我也在想那个方向的东西,但是如何进行转换呢?如果我可以做出反应,可以告诉最后激活的两个(按钮和选择)中的哪一个,但仍然没有在按钮上双重触发。 @jacobjacox 有点像你想的编辑? 明天我会发布一个例子。 【参考方案1】:

这是您的时间戳想法的更简单实现。我已将阈值设置为 0.5 秒,但实际阈值只能在考虑应用程序中的其他反应性依赖项后才能确定。您还应该查看 observeobserveEventpriority 参数,使用它们可以潜在地控制反应器的执行顺序。

话虽如此,我仍然觉得有更好的方法可以做到这一点。我认为查看?shiny::throttle?shiny::debounce 也会有所帮助。

library(shiny)
ui <- fluidPage(
  selectInput("A_sel","select", c("A","B","C","D"),"A",FALSE)
  ,selectInput("B_sel","same", c("A","B","C","D"),"A",FALSE)
  ,actionButton("ForceCombi", "force C and D")
)

server <- function(input, output, session) 

  tstamp <- reactiveValues(t = Sys.time())

  observeEvent(input$A_sel, 
    req((Sys.time() - tstamp$t) > 0.5)
    tstamp$t <- Sys.time()
    updateSelectInput(session,"B_sel", selected = input$A_sel)
  )

  observeEvent(input$ForceCombi, 
    updateSelectInput(session,"A_sel", selected = "C")
    updateSelectInput(session,"B_sel", selected = "D")
    tstamp$t <- Sys.time()
  )


shinyApp(ui, server)

【讨论】:

以上是关于定期禁用 updateSelectInput()的主要内容,如果未能解决你的问题,请参考以下文章

shinyURL 与 updateSelectInput 的交互

R Shiny - 我的观察函数(UpdateSelectInput)有啥问题?

R 用 updateSelectInput 反应闪亮

闪亮,observeEvent,updateSelectInput,输入重置

用于多个输入的闪亮 updateSelectInput

观察事件中的R闪亮updateSelectInput不起作用