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

如何在R Shiny App的destination可排序rank_list中设置默认值

实现Shiny中sortable rank_list初始填充指定值

场景1:支持重复拖拽(source始终保留所有选项)

直接修改UI中destination的初始标签,并完善server端的空值处理逻辑,即可实现启动时destination默认填充"b",同时保留重复拖拽的功能:

library(shiny)
library(sortable)

ui <- fluidPage(
  fluidRow(
    column( 
      width = 6,
      uiOutput("main_rank")
    ),
    column( width =6,
            rank_list(
              text = "Destination",
              labels = c("b"),  # 初始填充"b"值
              input_id = "other_rank",
              options = sortable_options(group = "my_shared_group")
            )
    )
  ) 
)

server <- function(input,output) {
  # 响应式生成source的选项列表
  rankvars = reactive({
    fixedItems = c("a", "b", "c", "d")
    # 处理input初始为空的情况,确保初始used值为"b"
    used = unique(input$other_rank %||% "b")
    # 保留所有固定选项,支持重复拖拽
    unique(c(setdiff(fixedItems, used), used))
  })
  
  output$main_rank = renderUI({
    fluidRow(
      rank_list(
        text = "Source",
        labels = rankvars(),
        input_id = "main_list",
        options = sortable_options(group = "my_shared_group")
      ) 
    )
  })
}

shinyApp(ui, server)

说明

  • 通过UI中rank_list的labels参数直接设置初始值,启动后destination自动显示"b"。
  • 用%||%(Shiny内置空值处理运算符)确保input未初始化时,used变量能取到初始的"b",避免计算错误。
  • 原有逻辑保留了所有固定选项在source中,可重复将同一选项拖拽到destination。

场景2:source仅显示未拖拽到destination的选项

如果希望source初始时不包含已在destination的"b",且拖拽后source自动移除对应选项,修改rankvars()的返回逻辑即可:

library(shiny)
library(sortable)

ui <- fluidPage(
  fluidRow(
    column( 
      width = 6,
      uiOutput("main_rank")
    ),
    column( width =6,
            rank_list(
              text = "Destination",
              labels = c("b"),  # 初始填充"b"值
              input_id = "other_rank",
              options = sortable_options(group = "my_shared_group")
            )
    )
  ) 
)

server <- function(input,output) {
  # 响应式生成source的选项列表
  rankvars = reactive({
    fixedItems = c("a", "b", "c", "d")
    # 处理input初始为空的情况,确保初始used值为"b"
    used = unique(input$other_rank %||% "b")
    # 仅保留未被拖拽到destination的选项
    setdiff(fixedItems, used)
  })
  
  output$main_rank = renderUI({
    fluidRow(
      rank_list(
        text = "Source",
        labels = rankvars(),
        input_id = "main_list",
        options = sortable_options(group = "my_shared_group")
      ) 
    )
  })
}

shinyApp(ui, server)

说明

  • 将rankvars()的返回值改为setdiff(fixedItems, used),source只会显示尚未拖拽到destination的选项。
  • 启动时source显示c("a","c","d"),destination显示"b";拖拽"a"到destination后,source会自动更新为c("c","d")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:45:00