如何在Shiny应用中为列表元素设置响应式名称?
解决Shiny中动态设置列表名称的问题
你原来用glue的{{}}语法在list里设置名称是无效的——列表的命名参数会被当作字面量字符串,不会解析input的响应值,所以才会得到"{{input$choices}}"作为列表名,而非选中的选项。
下面是几种可行的解决方法:
方法1:使用setNames()函数(最简洁)
直接通过setNames()给列表绑定动态名称:
data <- reactive({ setNames(list(TRUE), input$choices) })
方法2:手动赋值列表名称
先创建无命名列表,再通过names()赋值响应式名称:
data <- reactive({ lst <- list(TRUE) names(lst) <- input$choices lst })
方法3:通过列表索引动态添加元素
直接用方括号索引创建带响应式名称的列表元素:
data <- reactive({ lst <- list() lst[[input$choices]] <- TRUE lst })
修改后的完整代码示例
以方法1为例,替换原server部分的代码后:
library(shiny) ui <- fluidPage( titlePanel("Make reactive a named list"), sidebarLayout( sidebarPanel( selectInput("choices", "Make a choice", c("example1", "example2", "example3")) ), mainPanel( textOutput("text") ) ) ) server <- function(input, output) { data <- reactive({ setNames(list(TRUE), input$choices) }) output$text <- renderPrint({ data() }) } shinyApp(ui = ui, server = server)
运行后,当你选择下拉菜单中的选项(比如example2),输出就会显示$example2 [1] TRUE,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

