【问题标题】:R shiny - possible issue with update***Input and reactivityR闪亮-更新***输入和反应性可能存在问题
【发布时间】:2015-10-29 07:45:22
【问题描述】:

在处理 Shiny 应用程序时,我偶然发现了以下问题,这似乎与更新***输入更改输入与反应性顺序的顺序有关。

我已经能够将重现问题的代码和步骤缩小到以下几个:

  • 我有一个介于 1 和 5 之间的 numericInput,默认值为 3,其选定的值用于产生一些输出(为简单起见,如果值为 2,则此处只是一条“好”消息, 3 或 4,如果值为 1 或 5,则显示“Bad”消息);
  • 我希望用户能够更改输入值并在应用程序的其余部分使用其选择的值(通过按下提交按钮)或使用默认值(通过按下重置按钮);
  • 条件 1

sn-ps的代码如下

ui.R:

shinyUI(fluidPage(
    titlePanel(
        fluidRow(headerPanel(HTML("Test a possible bug"),  windowTitle = "Test a possible bug")
        )
    ),
    mainPanel(
        tabsetPanel(
            tabPanel("Try this", br(),
                numericInput(inputId="foo", label="Input me", value=3,min=1, max=5),
                actionButton(inputId="reset", label="Use default"),
                actionButton(inputId="submit", label="Use new value"),br(),br(),br(),
                textOutput(outputId="bar")
            )
        )
    )
))


服务器.R:

shinyServer(function(input, output, session) {

    observeEvent(input$reset, {
        updateNumericInput(session=session, inputId="foo", value=3)
    })

    checkInput <- reactive({
        input$submit
        input$reset
        isolate({
            input$foo > 1 && input$foo < 5
        })
    })

    output$bar <- renderText({
        if (checkInput())
            "Good"
        else
            "Bad"
    })

})

我遇到的问题如下

  1. 如果我选择 5,应用会正确打印“错误”消息
  2. 如果我现在按“使用默认值”,numericInput 会正确更新为默认值 3,但消息仍然是“错误”,因为闪亮的输入的修改(尚未)确认
  3. 如果我现在再次按下“使用默认值”按钮,或者如果我按下“使用新值”按钮,则消息现在正确更新为“良好”

另一方面,我希望闪亮确认更新的输入,因为 输入字段已更改

这是设计使然吗?有什么解决问题的建议吗? 我可以通过要求用户单独将值重置为默认值然后提交新值来解决此问题,但这听起来有点不令人满意...

附言我的实际代码有十几个 numericInput 字段,因此确实需要“使用默认值”按钮,因为在此处发布的简化设置之外,手动恢复所有值并不是真正可行的选项;-)

【问题讨论】:

    标签: r shiny rstudio


    【解决方案1】:

    我相信这就是它的预期工作方式。如果您查看 updateNumericInput 或 updateSelectInput 的文档,则会在生成所有输出后完成更新。

    "输入更新函数向客户端发送消息,告诉它 更改输入对象的设置。消息被收集 并在所有观察者(包括输出)完成后发送 正在运行。”

    我建议以这样一种方式设置功能,即仅在点击“提交”时才显示“好”或“坏”消息,并且在点击“重置”时将其“清除”。希望这有用

    请看示例

    library(shiny)
    
    ui<-(fluidPage(
      titlePanel(
        fluidRow(headerPanel(HTML("Test a possible bug"),  windowTitle = "Test a possible bug")
        )
      ),
      mainPanel(
        tabsetPanel(
          tabPanel("Try this", br(),
                   numericInput(inputId="foo", label="Input me", value=3,min=1, max=5),
                   actionButton(inputId="reset", label="Use default"),
                   actionButton(inputId="submit", label="Use new value"),br(),br(),br(),
                   textOutput(outputId="bar")
          )
        )
      )
    ))
    
    server<-(function(input, output, session) {
    rv <- reactiveValues()
    
      observeEvent(input$reset, {
        updateNumericInput(session=session, inputId="foo", value=3)
         rv$Message = " "
    
      })
    observeEvent(input$submit,{
      rv$checkInput<- input$foo > 1 && input$foo < 5
    
        if (rv$checkInput)
         rv$Message<- "Good"
        else
          rv$Message<-  "Bad"
    })
    
    
      output$bar <- renderText({
        rv$Message
      })
    
    })
    
    shinyApp(ui,server)
    

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 2020-08-18
      • 2020-12-28
      • 2020-08-01
      • 2019-06-30
      • 2022-10-31
      • 2020-07-04
      • 1970-01-01
      相关资源
      最近更新 更多