我想基于nested list中的text个元素递归地在SHINY中创建div个元素:

nodes <- list(
      list(
        text = "RootA",
        state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE),
        children = list(
          list(
            text = "ChildA1",
            state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE)
          ),
          list(
            text = "ChildA2",
            state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE)
          )
        )
      ),
      list(
        text = "RootB",
        state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE),
        children = list(
          list(
            text = "ChildB1",
            state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE),
            children = list(
              list(
                text = "ChildB1a",
                state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE)
              ),
              list(
                text = "ChildB1b",
                state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE)
              )
            )
          ),
          list(
            text = "ChildB2",
            state = list(loaded = TRUE, opened = TRUE, selected = FALSE, disabled = FALSE)
          )
        )
      )
    )

我试着使用purrr:map,但它只在顶层有效:

purrr::map(nodes, function(x){
  if("text" %in% names(x)){
    div(x$text)
  }
})

这是我的预期输出(使用style参数只是为了说明):

library(shiny)

divs <- list(
  div("RootA",
      div("ChildA1"),
      div("ChildA2"),
      style = "background-color: aqua;"
  ),
  div("RootB",
      div("ChildB1",
          div("ChildB1a"),
          div("ChildB1b")),
      div("ChildB2"),
      style = "background-color: lightgreen;"
    )
)
   
ui <- fluidPage(
  divs
)

server <- function(input, output, session) {
  
}

shinyApp(ui, server)

推荐答案

您需要进行一些递归.这应该行得通

to_div <- function(x) {
  shiny::div(x$text, if ("children" %in% names(x)) lapply(x$children, to_div))
}

divs <- lapply(nodes, to_div)

这就是回报

[[1]]
<div>
  RootA
  <div>ChildA1</div>
  <div>ChildA2</div>
</div>

[[2]]
<div>
  RootB
  <div>
    ChildB1
    <div>ChildB1a</div>
    <div>ChildB1b</div>
  </div>
  <div>ChildB2</div>
</div>

R相关问答推荐

通过绘图 Select 线串几何体并为其着色

从多个前置日期中获取最长日期

在位置周围设定一个半径并识别该半径内的其他位置

向gggplot 2中的数据和轴标签添加大写和星号

在R中替换函数中的特定符号

如何直接从R中的风险分数计算c指数?

如何在ggplot中标记qqplot上的点?

未识别时区

如何在观测缺失的地方添加零

如何从R ggplot图片中获取SVG字符串?

可以替代与NSE一起使用的‘any_of()’吗?

在使用bslb和bootstrap5时,有没有办法更改特定dt行的 colored颜色 ?

将多个列值转换为二进制

在R中创建连续的期间

从数据创建数字的命名列表.R中的框

如何在反曲线图中更改X标签

在不对R中的变量分组的情况下取两行的平均值

我需要使用ggplot2制作堆叠条形图

R没有按顺序显示我的有序系数?

网络抓取NBA.com