以下最小示例演示了更新嵌套输出的问题,然后使用更新输出之前的内容更新输入。这个最小的例子来自一个更大的项目,所以除非Shiny实际上不允许嵌套输出,否则像“不嵌套输出”这样的问题的解决方案是不可行的。
运行示例时,您将看到两个单选按钮和一个文本输入。输入一些文字并更改单选按钮。您将看到在处理单选按钮事件后,文本输入确实已更新。但是,如果再次更改单选按钮,observeEvent()
处的文本输入将为空白。
这就像updateTextInput()
函数可以更新您在浏览器中看到的内容,但完全不适用于Shiny从下一个事件的浏览器返回的内容。
要添加一些奇怪的内容,还要注意,如果您以任何方式更改更新的文本输入(例如,向其中添加或删除一个字符),那么它将按预期工作。问题出在我的代码,我的期望还是Shiny中的错误?
ui <- fluidPage(fluidRow(column(12, tagList(
uiOutput("outer_div")
))))
server <-function(input, output, session) {
updateScreen = function() {
output$outer_div = renderUI(uiOutput("inner_div"))
output$inner_div = renderUI(tagList(
radioButtons(inputId = "button", label="", choices = c("A", "B")),
textInput("text", label="", value="")
))
}
updateScreen() #initialize screen
observeEvent(input$button, {
print(paste0("Text input is ", input$text))
updateTextInput(session, inputId = "text" , value=input$text)
updateRadioButtons(session, inputId="button", selected=input$button)
updateScreen()
})
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:0)
这对你有用吗?
ui <- fluidPage(fluidRow(column(12, tagList(
uiOutput("outer_div")
))))
server <-function(input, output, session) {
updateScreen = function() {
output$outer_div = renderUI(uiOutput("inner_div"))
output$inner_div = renderUI(tagList(
radioButtons(inputId = "button", label="", choices = c("A", "B")),
textInput("text", label="", value="")
))
}
updateScreen() #initialize screen
data <- isolate(input$text)
observeEvent(input$button, {
updateTextInput(session, inputId = "text" , value=data)
updateRadioButtons(session, inputId="button", selected=input$button)
print(paste0("Text input is ", input$text))
#updateScreen()
})
}
shinyApp(ui = ui, server = server)