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

如何创建随动作按钮动态新增的响应式Ranklist?

问题描述

想要实现点击动作按钮时动态新增对应数量的拖拽盒子,初始化了counter响应式变量关联按钮,但使用counter时程序报错,将counter替换为具体数值时程序可正常运行。

问题原因
  1. counter是reactiveVal对象,不能直接用于1:counter这类序列生成语法,必须通过counter()调用获取当前值
  2. rank_list_exogenous未设置为响应式,无法跟随counter的变化自动更新
  3. 所有新增rank_list的input_id重复,会导致交互逻辑冲突
修正后的代码
library(shiny)
library(DT)
library(readr)
library(shinythemes)
library(shinydashboard)
library(sortable)

testdataset <- data.frame(A = runif(n=4, min=1, max=6),B = runif(n=4, min=1, max=6),C = runif(n=4, min=1, max=6))

ui <- dashboardPage(
  dashboardHeader(title = "ShinySem"),
  dashboardSidebar(
    sidebarMenu(
      menuItem("Insert data", tabName = "data"),
      menuItem("Choosing variables", tabName = "drag")
    )
  ),
  dashboardBody(
    tabItems(
      tabItem(tabName = "data",
              fileInput("infile","Insert your dataset in csv",accept = c(".csv","text/csv","text/comma-separated-values")),
              radioButtons("separator","Separator: ",choices = c(";",",",":"), selected=";",inline=TRUE),
              dataTableOutput("userfile")),
      tabItem(tabName = "drag",
              actionButton("addex","Add Latent Exogenous variable"),
              actionButton("adden","Add Latent Endogenous variable"),
              textOutput("ex"),
              uiOutput("bucket"))
    )
  )
)

server <- function(input,output,session){
  # Rendering data
  df_uploads <- reactive({
    data <- input$infile
    if (is.null(data))
      return(testdataset)
    df <- read.csv(data$datapath, header = TRUE,sep = input$separator)
    return(df)
  })
  
  output$userfile<- renderDataTable({
    df <- df_uploads()
    datatable(df)
  })
  
  # Reactive counter for exogenous variables
  counter <- reactiveVal(value = 1)
  
  observeEvent(input$addex, {
    counter(counter() + 1)
  })
  
  # Reactive rank list for exogenous variables (dynamic based on counter)
  rank_list_exogenous <- reactive({
    lapply(1:counter(), function(i){
      add_rank_list(
        text = paste("Latent Exogenous variable", i),
        labels = NULL,
        input_id = paste0("latent_exogenous_", i)
      )
    })
  })
  
  # Render Bucket list and drag and drop
  output$bucket <- renderUI(
    do.call("bucket_list", args = c(
      list(header = "Drag and drop",
           group_name = "bucketlistgroup",
           orientation = "horizontal",
           add_rank_list(
             text = "dataset you have insert",
             labels = colnames(df_uploads()),
             input_id = "starting_variables")),
      rank_list_exogenous()
    ))
  )
}

shinyApp(ui, server)
关键修改说明
  • 将rank_list_exogenous定义为reactive表达式,依赖counter()的值,每次counter更新时自动重新生成rank_list列表
  • 使用1:counter()替代1:counter,正确获取响应式变量的当前数值
  • 为每个rank_list设置唯一的input_id(如latent_exogenous_1、latent_exogenous_2),避免ID重复导致的交互问题
  • 在renderUI中调用rank_list_exogenous(),确保每次counter变化时重新渲染整个bucket_list

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:27:02