我最近发现了reactiveValuesToList()
函数,我用它来跟踪我的应用程序中的输入,因为一些输入是动态创建的。以下是一个简单的例子来说明函数的奇怪行为。
我的应用有3个组件:
checkBoxGroupInput()
:有3个选择
uiOutput()
:根据用户选中的框动态创建数字输入。
textOutput()
:显示网络应用中所有输入用户界面的ID。
以下是上述简单app的脚本:
library(shiny)
ui <- fluidPage(
# The user selects team names
checkboxGroupInput(inputId = "team", label = "Select team", choices = letters[1:3]),
br(),
# Placeholder for the dynamic numeric inputs that are created based on the selected team names
uiOutput(outputId = "dynUI1"),
# Text output for the names of the input UIs in the shiny app
textOutput(outputId = "uiIds")
)
server <- function(input, output){
# These are the input IDs of the dynamically created UI in dynUI1
uiNames <- c(a = "id_a", b = "id_b", c = "id_c")
output$dynUI1 <- renderUI({
if(length(input$team) == 0){
return(NULL)
} else {
lapply(1:length(input$team), function(i){
inputname <- paste0("Points: team ", input$team[i])
numericInput(inputId = uiNames[input$team[i]], label = inputname, value = 1, min = 1, max = 5)
})
}
})
output$uiIds <- renderText({
names(reactiveValuesToList(input))
})
}
shinyApp(ui = ui, server = server)
在应用启动时,textOuput
会显示team
,这是正确的,因为这是应用中唯一的输入元素。例如,选中a
后,textOutput
会显示team
和id_a
,因为新的输入元素刚刚添加到应用中。奇怪的行为是这样的:当取消选中a
时,即使动态输入元素从应用程序中消失,其ID也会保留在textOutput
中。
为什么?我该如何纠正?
请复制,粘贴代码并运行以便亲自查看。