闪亮:更新输入而不触发反应?

Jul*_*ian 7 r reactive-programming shiny

是否有可能在不触发反应的情况下更新输入?

下面我举了一个最小的例子。目的是在不改变主面板中的值的情况下更新滑块。当滑块再次更改时,应再次将其转发给相关反应。

问题和潜在用例类似于以下问题:R 闪亮 - 更新***输入和反应性更新 SelectInput可能存在问题而没有触发反应性?. 与这些问题类似,在我的用例中有一个依赖于两个输入的反应。我想根据另一个更新这些输入中的一个,这导致反应性计算两次。然而,这两个问题都通过选择性地更新输入来解决这个问题。这在我的用例中是不可能的,因为我想通过更新输入向用户显示一些信息。

如果没有可能在不触发反应的情况下更新输入,我会问一个关注我的用例的后续问题。

例子

library(shiny)

ui <- fluidPage(
   titlePanel("Update Slider - Isolate reaction?"),

   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30),
         actionButton("set1", "set slider 'bins'$value=20"),
         actionButton("set2", "'ISOLATED' set slider 'bins'$value=20 ")
      ),

      mainPanel(
         textOutput("sliderValue")
      )
   )
)

# Define server logic 
server <- function(input, output, session) {
   output$sliderValue <- renderText(input$bins) 

   observeEvent(input$set1,{
     updateSliderInput(session,"bins",value=20)
   })
   observeEvent(input$set2,{
     ## Is there any possibility to update the slider without 'sliderValue' changing?
     #isolate does not work
     isolate(
       updateSliderInput(session,"bins",value=20 )
       )
   })
}

shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

r2e*_*ans 4

这是一个尝试,尽管感觉使用过时的数据可能会产生副作用。使用以下差异

 # Define server logic
 server <- function(input, output, session) {
-  output$sliderValue <- renderText(input$bins)
+  output$sliderValue <- renderText({ saved_bins(); })

+  update <- reactiveVal(TRUE)
+  saved_bins <- reactiveVal(30)
+
+  observeEvent(input$bins, {
+    if (update()) saved_bins(input$bins) else update(TRUE)
+  })
   observeEvent(input$set1,{
     updateSliderInput(session,"bins",value=20)
   })
   observeEvent(input$set2,{
     ## Is there any possibility to update the slider without 'sliderValue' changing?
     #isolate does not work
+    update(FALSE)
-    isolate(
       updateSliderInput(session,"bins",value=20 )
-    )
   })
 }
Run Code Online (Sandbox Code Playgroud)

saved_bins方法:使用两个新的反应值,一个存储 ( ) 在渲染中使用的数据,一个 ( update) 存储该数据是否应该更新。一切依赖的东西input$bins都应该依赖saved_bins()。通过使用附加的observeEvent,反应性将始终按照最初期望的方式级联,除非您使用前置的 明确设置一次性“不级联” update(FALSE)

完整代码如下:

 # Define server logic
 server <- function(input, output, session) {
-  output$sliderValue <- renderText(input$bins)
+  output$sliderValue <- renderText({ saved_bins(); })

+  update <- reactiveVal(TRUE)
+  saved_bins <- reactiveVal(30)
+
+  observeEvent(input$bins, {
+    if (update()) saved_bins(input$bins) else update(TRUE)
+  })
   observeEvent(input$set1,{
     updateSliderInput(session,"bins",value=20)
   })
   observeEvent(input$set2,{
     ## Is there any possibility to update the slider without 'sliderValue' changing?
     #isolate does not work
+    update(FALSE)
-    isolate(
       updateSliderInput(session,"bins",value=20 )
-    )
   })
 }
Run Code Online (Sandbox Code Playgroud)