我正在尝试创建一个Shiny应用程序,其形式可以根据存储在数据框中的输入生成标签和输入(例如,textInput,selectInput等)。我在下面创建了一个简单的例子来解释我想要完成的任务。有任何想法吗?我想使用tidyverse,但另一种方法将起作用。
# This is what I want
tabsetPanel(
tabPanel("1",
textInput("a", "a_lab"),
textInput("b", "b_lab")),
tabPanel("2",
textInput("c", "c_lab"),
textInput("d", "d_lab")),
tabPanel("3",
textInput("e", "e_lab"),
textInput("f", "f_lab"))
)
# I have a dataframe that looks like this as my input
tab_str <- data.frame(
tabnam=c(1,1,2,2,3,3),
id=letters[1:6],
lab=paste0(letters[1:6],"_lab")
)
# My function to make input controls are something like this
make_ctrl <- function(id, lab) textInput(id, lab)
# How can I obtain what I want--example at the top--using a "loop" approach;
# if possible using tidyverse; obviously what I have below is not working
tab_str %>% map(make_ctrl, id=tab_str$id)
答案 0 :(得分:0)
我对tidyverse软件包不太熟悉,所以这里有一个基本的R例子,让我知道tidyverse等价物。
基本要点是:
tabPanel
tabsetPanel
s tabPanel
此示例使用:
apply
映射data.frame
行tapply
分组列表元素lapply
映射列表do.call
使用列表inputs_by_tab <- tab_str %>%
apply(1, function(row) textInput(row["id"], row["lab"])) %>%
tapply(tab_str$tabnam, list)
tabs <- lapply(names(inputs_by_tab), function(name) {
do.call(tabPanel, list(title = name, inputs_by_tab[[name]]))
})
tabset <- do.call(tabsetPanel, tabs)