停止更新*来自无效反应的输入

Stop update*Input from invalidating reactive

我正在寻找一种方法来阻止 update*Input 函数使我的 Shiny 应用程序中的反应值无效。我希望更新功能仅更改视觉 UI 组件,而不更改基础反应值。

这是一个代表:

library(shiny)

ui <- fluidPage(

    sliderInput("slide1", "Slider", min = 0, max = 10, value = 5),
    sliderInput("slide2", "Slider2", min = 0, max = 10, value = 0),
    
    textOutput("slide2_val")
)

server <- function(input, output, session) {
    
    observe({
        updateSliderInput(session, "slide2", value = input$slide1)
    }) |> 
        bindEvent(input$slide1)
    
    output$slide2_val <- renderText({
        paste("Value of `slide2`:", input$slide2)
    })
}

shinyApp(ui, server)

期望的行为是 input$slide2 的值仅在用户与 slide2 交互时更改,而滑块 UI 元素在与 slide1 或 slide2 交互时更改。

重要的是,这需要适用于各种 input* 功能。监听点击事件不适用于像 selectInput 这样的输入(见我的 related issue)。

在我的 recent answer to another question 我做了一个 suspendForNextFlush() 函数来暂时停止对一个 输入被发送到 Shiny。该功能可用于解决您的问题 问题也一样。

我已经把这个功能放在实验中了 shinysuspend 包。你可以 从 GitHub 安装它:

remotes::install_github("mikmart/shinysuspend")

然后在 UI 中包含 useShinysuspend(),然后调用 suspendForNextFlush() 从服务器更新 slide2 时:

library(shiny)
library(shinysuspend)

ui <- fluidPage(
  useShinysuspend(),
  sliderInput("slide1", "Slider 1", min = 0, max = 10, value = 5),
  sliderInput("slide2", "Slider 2", min = 0, max = 10, value = 0),
  textOutput("slide2_val")
)

server <- function(input, output, session) {
  observe({
    suspendForNextFlush("slide2")
    updateSliderInput(session, "slide2", value = input$slide1)
  })
  
  output$slide2_val <- renderText({
    paste("Value of `slide2`:", input$slide2)
  })
}

shinyApp(ui, server)