【发布时间】:2019-03-16 22:49:32
【问题描述】:
我正在尝试使用 purr map 函数或其变体来跨多个函数映射数据(在我的例子中是 R-Shiny 函数)。我正在读取来自example.json 的参数。
{
"Section_1": {
"MainHeader": [{
"School": "Montessori"
}],
"boxitems": [{
"tabName": "id1",
"box": [{
"title": "Students graph",
"custofun": ["Bob", "Dan", "Sean"]
},
{
"title": "Teacher graph",
"custofun": ["Robinson"]
}
]
},
{
"tabName": "id2",
"box": [{
"title": "Students graph",
"custofun": ["Felix", "Helix", "Alex"]
},
{
"title": "Teacher graph",
"custofun": ["Phelix"]
}
]
}
]
}
}
我把它读成了df 格式
json <- fromJSON("example.json")
我正在尝试通过将 tabItem 及其 box'es 包装在 map 函数中来动态生成它们,例如仅映射 tabItem 值我可以使用 map。
map(unique(df$id), ~ tabItem(tabName = .x))
这将为tabItem 生成html 代码,其中包含我在json 文件中拥有的所有ID 列表。对于我拥有的 json 结构,我需要遍历 ID -> list -> list。并且,将各自的输入参数传递给tabItem,box 尝试了pmap 等其他变体,但无法解决。如何在该数据结构的数据框中递归使用 purr map 函数?
这是我的尝试
json$Section_1$boxitems %>% as.tibble() # to check the strucutre
df <- json$Section_1$boxitems %>% select(tabName,box)
df$box <- setNames(df$box,df$tabName)
BoxCustomFunc <- function(tabName,box) {
map(tabName , ~ tabItem(tabName = .x),
map2(x = box, y = box[tabName],
box(title = .x$title,
column(width = 2, get(.y$custofun)(tabName)))
))
}
下面的当前输出。我得到的是tabItem,缺少的是框和列的html 输出。似乎map2 甚至没有渲染。
[[1]]
<div role="tabpanel" class="tab-pane" id="shiny-tab-id1"></div>
[[2]]
<div role="tabpanel" class="tab-pane" id="shiny-tab-id2"></div>
【问题讨论】:
-
制作这个reproducible & minimal的几件事:第一,我们需要查看具有代表性的数据样本,而不是文本打印输出,因为您正在处理有关数据类型的问题;第二,这个问题实际上与 Shiny 无关,所以你不需要在这里引用 Shiny
-
感谢您的指出,我分享了我有这个结构的 json 文件。希望这会有所帮助。