You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shiny模块中将UI端静态数据传递至Server端

解决方案

核心思路是在UI组件中嵌入一个隐藏的输入控件,将choices列表序列化后存入该控件,Server端直接读取解析即可,既不需要重复传参,也不需要动态渲染UI。

完整实现代码

library(shiny)
library(jsonlite)

rotatingRadioInput <- function(id, label, choices = c('A' = 'a', 'B' = 'b'), selected = 'a') {
  labelNames <- names(choices)
  values <- unname(choices)

  tagList(
    radioButtons(NS(id, "radio"), 
                 label = NULL,
                 choiceValues = values,
                 choiceNames = labelNames,
                 selected = selected
    ),
    actionButton(NS(id, 'rotate'), 'rotate'),
    # 新增隐藏输入存储choices序列化结果
    textInput(
      inputId = NS(id, "choices_cache"),
      label = NULL,
      value = toJSON(choices, auto_unbox = TRUE),
      style = "display: none;"
    )
  )
}

rotatingRadioServer <- function(id) {
  moduleServer(id, function(input, output, session) {
    # 解析得到完整choices列表
    choices <- reactive(unlist(fromJSON(input$choices_cache)))
    
    observeEvent(input$rotate, {
      current_idx <- which(choices() == input$radio)
      next_idx <- ifelse(current_idx == length(choices()), 1, current_idx + 1)
      updateRadioButtons(session, "radio", selected = choices()[next_idx])
    })
    
    reactive({
      input$radio
    })
  })
}

rotatingRadioApp <- function() {
  ui <- fluidPage(
    rotatingRadioInput("rotate"),
    textOutput("value")
  )
  server <- function(input, output, server) {
    rotatingValue <- rotatingRadioServer("rotate")
    output$value <- renderText(paste0("Selected: ", rotatingValue()))
  }
  
  shinyApp(ui, server)
}

# 启动测试
# rotatingRadioApp()

核心改动说明

  • UI侧新增了一个样式设置为隐藏的textInput,将传入的choices列表序列化为JSON字符串作为默认值存储,无需额外依赖包实现隐藏效果
  • Server侧直接读取该隐藏输入的值,反序列化得到完整的choices向量,不需要额外传入参数
  • 旋转逻辑中通过当前选中值的索引计算下一个选项,自动支持任意长度的choices列表,到达最后一个选项后自动跳回第一个

如果不想引入jsonlite依赖,也可以将choices用逗号拼接的方式序列化,只需对应修改序列化和反序列化的逻辑即可。


内容的提问来源于stack exchange,提问作者student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:18:03