在处理Shiny应用程序时,我偶然发现了以下问题,该问题似乎与更新***输入与反应性顺序更改输入的顺序有关。
我已经能够缩小代码和步骤以将问题重现为以下问题:
代码片段如下
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"
})
})
我遇到的问题是以下
另一方面,我希望闪亮确认更新的输入,因为输入字段已更改
这种行为是否符合设计要求?有什么建议可以解决问题吗? 我可以通过要求用户单独将值重置为默认值然后提交新值来解决问题,但听起来有点令人不满意......
P.S。我的实际代码有十几个numericInput字段,因此&#34;使用默认&#34;确实需要按钮,因为在此处发布的简化设置之外,手动恢复所有值并不是一个可行的选项; - )
答案 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)