R闪亮 - 更新时可能出现的问题***输入和反应

时间:2015-08-06 08:50:41

标签: r shiny rstudio

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

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

  • 我有一个数字输入,其范围在1和5之间,默认值为3,其选定的值用于产生一些输出(为了简单起见,这里只是"好&# 34;如果值为2,3或4则发出消息,如果值为1或5则发出" Bad"消息;
  • 我希望用户能够更改输入值并使用其选择的值(通过按“提交”按钮)或使用应用程序其余部分的默认值(通过按“重置”按钮);
  • 检查条件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,该应用程序会正确打印出一个&#34; Bad&#34;消息
  2. 如果我现在按&#34;使用默认&#34; numericInput正确更新为默认值3,但邮件仍然是&#34; Bad&#34;因为光亮的
  3. 尚未确认输入的修改
  4. 如果我现在按第二次&#34;使用默认&#34;按钮,或者如果我按下&#34;使用新值&#34;按钮,消息现在已正确更新为&#34; Good&#34;
  5. 另一方面,我希望闪亮确认更新的输入,因为输入字段已更改

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

    P.S。我的实际代码有十几个numericInput字段,因此&#34;使用默认&#34;确实需要按钮,因为在此处发布的简化设置之外,手动恢复所有值并不是一个可行的选项; - )

1 个答案:

答案 0 :(得分:0)

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