繁体   English   中英

R闪亮-更新可能存在问题***输入和反应性

[英]R shiny - possible issue with update***Input and reactivity

在使用Shiny应用程序时,我偶然发现了以下问题,该问题似乎与更新更改输入的顺序有关。

我已经能够缩小代码和步骤来将问题重现为以下内容:

  • 我有一个numericInput,范围为1到5,默认值为3,其选定值用于产生一些输出(为简单起见,如果该值为2、3或4,则它只是一条“好”消息,如果值为1或5,则显示“错误”消息);
  • 我希望用户能够更改输入值,并在应用程序的其余部分中使用其选择的值(通过按Submit按钮)或使用默认值(通过按Reset按钮);
  • 条件1 <value <5的检查最好必须在隔离块内部(因为我的实际完整代码会根据输入触发各种耗时的操作)

代码段如下

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")
            )
        )
    )
))


server.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. 如果现在按“ Use default”(使用默认值),则numericInput将正确更新为默认值3,但消息仍为“ Bad”,因为未通过闪亮确认输入修改(但)
  3. 如果我现在再次按“使用默认值”按钮,或者如果我按“使用新值”按钮,则消息现在已正确更新为“良好”

另一方面,由于输入字段已更改 ,因此我希望Shiny确认更新的输入

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

ps我的实际代码中有12个numericInput字段,因此确实需要“使用默认值”按钮,因为在此处发布的简化设置之外,手动还原所有值并不是一个切实可行的选择;-)

我相信这就是它的预期工作方式。 如果您查看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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM