对此的基本解决方案是使用额外的uiOutput "filters_UI" 来放置第二个 selectInput 和 radioButtons 并在其中添加 input$player_name,因此每当玩家名称发生变化时,完整的 uiOutput 将使用初始值再次创建。请参阅下面的示例。
library(shiny)
ui <- fluidPage(
fluidRow(
column(6, uiOutput('controls_UI')),
column(6, DT::dataTableOutput("table_DT"))
)
)
server <- shinyServer(function(input, output, session) {
# to simulate players
dat <- USJudgeRatings
players <- row.names(dat)
seasons <- names(dat)
output$controls_UI <- renderUI({
fluidRow(
column(6,
selectInput("player_name", "Players", players, selected = players[1])
),
column(6,
uiOutput("filters_UI"))
)
})
# render again if input$player_name changes
output$filters_UI <- renderUI({
input$player_name
fluidRow(
column(6,
selectInput("season", "Season", seasons, selected = seasons[1])
),
column(6,
radioButtons("contested", label = "Contested",
choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3),
selected = 1)
)
)
})
output$table_DT <- DT::renderDataTable(
datR(),
options = list(
scrollX = TRUE,
paging = TRUE,
lengthMenu = c(10, 20, 50)
),
selection = "single",
rownames = TRUE
)
# creates a table based on the sliders and radio buttons
datR <- reactive({
input$player_name
varName <- input$season
contested <- ifelse(is.null(input$contested),1,as.integer(input$contested))
dat0 <- data.frame( dat[sample(2:length(players),contested*3), varName] )
names(dat0) <- varName
dat0
})
})
shinyApp(ui, server)
希望对你有帮助。