如何创建随动作按钮动态新增的响应式Ranklist?
问题描述
想要实现点击动作按钮时动态新增对应数量的拖拽盒子,初始化了counter响应式变量关联按钮,但使用counter时程序报错,将counter替换为具体数值时程序可正常运行。
问题原因
counter是reactiveVal对象,不能直接用于1:counter这类序列生成语法,必须通过counter()调用获取当前值rank_list_exogenous未设置为响应式,无法跟随counter的变化自动更新- 所有新增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
相关产品推荐
相关产品推荐

