簡體   English   中英

updateSliderInput 僅以圖形方式更新,而不是實際值

[英]updateSliderInput only updates graphically, but not the actual value

在 Shiny 應用程序中,我想使用updateSliderInput()將 slider 重置為其初始值。 現在看來,這種情況發生了——暫時只有圖形而不是實際值( input$var1 ):在將 slider 設置為其初始 position 並按下“重置”后,Z10BF08F08F0BBD66894775554到它的初始 position 正如預期的那樣,而input$var1的打印值仍然顯示調整后的值。 第二次按“重置”,然后重置input$var1

代碼中有一些message()用於突出顯示終端中的事件序列(代碼大部分是從這里借來的)。

library(shiny)

ui <- fluidPage(
  titlePanel("Reset Slider Value"),
  fluidRow(column(4,
                  sliderInput("var1", "", min = -100, max = 100, value = 0),
                  actionButton('submit', 'Submit'),
                  actionButton("reset", "Reset")),
           column(6,
                  verbatimTextOutput("text1"),
                  verbatimTextOutput("text2")))
)

server <- function(input, output, session) {
  rv_text1 <- reactiveVal()
  rv_text2 <- reactiveVal()

  observeEvent(input$reset, {
    message("Going to update")
    updateSliderInput(session, 'var1', value = 0)
    message("Is updated")

    rv_text2(paste("on reset var1 =", input$var1))
    message(paste("reset: var1 =", input$var1))
  })


  observeEvent(input$submit, {
    rv_text1(paste("on submit var1 =", input$var1))
    print(paste0("submit: var1 =", input$var1))
  })

  output$text1 <- renderText({rv_text1()})
  output$text2 <- renderText({rv_text2()})
}

shinyApp(ui, server)

現在,我很困惑。 我本來預計input$var1的內容會隨着它的圖形表示而改變,特別是如果進一步依賴並處理 slider 的內容(就像我們的情況一樣)。 因此,如果有人能告訴我這是否是預期的行為(如果是,為什么)以及我在這里遺漏了什么或者這實際上是一個錯誤,那就太好了? 提前謝謝了: :)

我認為您的代碼剛剛完成運行觀察事件,然后它正在更改 var1 的值。 檢查 updateSliderInputdescription:“輸入更新程序函數向客戶端發送消息,告訴它更改輸入 object 的設置。在所有觀察者(包括輸出)完成運行后收集並發送消息。”。

如果您在另一個 observeEvent 中查看 input$var1,您可以看到它發生了變化:


    library(shiny)
    
    ui <- fluidPage(
      titlePanel("Reset Slider Value"),
      fluidRow(column(4,
                      sliderInput("var1", "", min = -100, max = 100, value = 0),
                      actionButton('submit', 'Submit'),
                      actionButton("reset", "Reset")),
               column(6,
                      verbatimTextOutput("text1"),
                      verbatimTextOutput("text2")))
    )
    
    server <- function(input, output, session) {
      rv_text1 <- reactiveVal()
      rv_text2 <- reactiveVal()
      
      observeEvent(input$reset, {
        message("Going to update")
        updateSliderInput(session, 'var1', value = 0)
        message("Is updated")
        
        rv_text2(paste("on reset var1 =", input$var1))
        message(paste("reset: var1 =", input$var1))
      })
      
      ## Added ##
      observeEvent(input$var1, {
        print(paste0("Here is the value of input$var1",input$var1))
        rv_text2(paste("on reset var1 =", input$var1)) # Well updated now
      })
      
      observeEvent(input$submit, {
        rv_text1(paste("on submit var1 =", input$var1))
        print(paste0("submit: var1 =", input$var1))
      })
      
      output$text1 <- renderText({rv_text1()})
      output$text2 <- renderText({rv_text2()})
    }
    
    
    shinyApp(ui, server)

重置后獲得input$var1正確值的一種解決方法是使用另一個反應性占位符變量,而不是用目標值填充:

library(shiny)

ui <- fluidPage(
  titlePanel("Reset Slider Value"),
  fluidRow(column(4,
                  sliderInput("var1", "", min = -100, max = 100, value = 0),
                  actionButton("submit", "Submit"),
                  actionButton("reset", "Reset")),
           column(6,
                  verbatimTextOutput("text1"),
                  verbatimTextOutput("text2"),
                  verbatimTextOutput("text3")))
)

server <- function(input, output, session) {
  rv_text1 <- reactiveVal()
  rv_text2 <- reactiveVal()
  rv_text3 <- reactiveVal()

  slider_value <- reactiveVal(0)

  value_to_reset_to <- 0

  observeEvent(input$submit, {
    rv_text1(paste("on submit var1 =", input$var1))
  })

  observeEvent(input$reset, {
    updateSliderInput(session, 'var1', value = value_to_reset_to)
    rv_text2(paste("on reset var1 =", input$var1))
    slider_value(value_to_reset_to)
  })

  observeEvent(input$var1, {
    slider_value(input$var1)
    rv_text3(paste("in placeholder =", slider_value()))
  })

  output$text1 <- renderText({rv_text1()})
  output$text2 <- renderText({rv_text2()})
  output$text3 <- renderText({rv_text3()})
}

shinyApp(ui, server)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM