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

如何在RShiny中使用collapsibleTree实现垂直可折叠树?

Great question! I’ve run into similar issues with collapsibleTree before, so let’s break this down into two parts: adjusting the existing collapsibleTree to render vertically, and exploring alternative packages that might fit your needs better—especially for use inside a bsModal.


Adjusting collapsibleTree to vertical layout

Since the official docs don’t include a native vertical layout option, we can use a CSS hack to rotate the underlying SVG (since collapsibleTree is built on D3.js). This will convert the horizontal tree to a vertical one, though you’ll need to tweak positioning to fit your bsModal.

Here’s how to implement it in your Shiny UI:

tags$style(HTML("
  /* Target the collapsibleTree SVG container */
  .collapsibleTree svg {
    /* Rotate the tree 90 degrees counterclockwise */
    transform: rotate(-90deg) translate(-600px, 0);
    /* Set the rotation origin to avoid clipping */
    transform-origin: top left;
    /* Adjust dimensions to fit your modal */
    height: 700px;
    width: 500px;
  }
"))

# Your existing collapsibleTree output inside the bsModal
bsModal("treeModal", "Vertical Tree", trigger = "showTreeBtn", size = "large",
        collapsibleTreeOutput("myTree", height = "700px")
)

Note: You’ll need to adjust the translate values and dimensions based on the size of your tree and modal to avoid overflow or clipping.


Alternative implementation ideas

If the CSS hack feels too fragile, here are three robust alternatives that natively support vertical tree layouts and work seamlessly with bsModal:

Option 1: visNetwork (flexible, interactive hierarchical trees)

visNetwork is built for network visualization and has excellent support for vertical hierarchical layouts. It’s highly customizable and works great in modals.

UI code:

bsModal("treeModal", "Vertical Tree", trigger = "showTreeBtn", size = "large",
        visNetworkOutput("verticalVisTree", height = "600px")
)

Server code:

output$verticalVisTree <- renderVisNetwork({
  # Replace with your actual tree data
  nodes <- data.frame(
    id = 1:5,
    label = c("Root", "Child 1", "Child 2", "Grandchild 1", "Grandchild 2")
  )
  edges <- data.frame(
    from = c(1, 1, 2, 2),
    to = c(2, 3, 4, 5)
  )
  
  visNetwork(nodes, edges) %>%
    # Set vertical (top-to-bottom) layout
    visHierarchicalLayout(direction = "UD", levelSeparation = 150) %>%
    # Add optional interactivity
    visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE)
})

Option 2: shinyTree (native Shiny tree component)

shinyTree is designed specifically for Shiny apps and defaults to a vertical collapsible tree structure. It integrates natively with Shiny’s reactive framework.

UI code:

bsModal("treeModal", "Vertical Tree", trigger = "showTreeBtn", size = "large",
        shinyTreeOutput("verticalShinyTree", height = "600px")
)

Server code:

output$verticalShinyTree <- renderShinyTree({
  # Replace with your nested tree data (as a list)
  tree_data <- list(
    "Root" = list(
      "Child 1" = list("Grandchild 1" = "", "Grandchild 2" = ""),
      "Child 2" = list("Grandchild 3" = "")
    )
  )
  
  # Render the vertical tree with a clean theme
  shinyTree(tree_data, theme = "proton", checkbox = FALSE)
})

Option 3: DT with row expansion (for simple tree structures)

If your tree is relatively flat, using DT (DataTables) with row grouping/expansion is a lightweight alternative. It’s fast and easy to implement.

UI code:

bsModal("treeModal", "Vertical Tree", trigger = "showTreeBtn", size = "large",
        DTOutput("treeDT", height = "600px")
)

Server code:

output$treeDT <- renderDT({
  # Replace with your flat parent-child data
  df <- data.frame(
    parent = c("", "Root", "Root", "Child 1", "Child 1"),
    node = c("Root", "Child 1", "Child 2", "Grandchild 1", "Grandchild 2"),
    value = c(100, 50, 50, 25, 25)
  )
  
  datatable(df, 
            extensions = "RowGroup",
            options = list(
              # Group rows by the parent column
              rowGroup = list(dataSrc = 1),
              # Hide the parent column (it's only for grouping)
              columnDefs = list(list(visible = FALSE, targets = 1))
            )
  )
})

Final notes

  • If you stick with collapsibleTree, the CSS hack works but requires careful tuning for your specific tree and modal size.
  • For long-term maintainability, visNetwork or shinyTree are better choices—they’re designed for this use case and avoid workarounds.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:36:40