使用"嵌套"创建闪亮的应用程序控件循环方法

时间:2017-10-14 03:53:04

标签: r shiny

我正在尝试创建一个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)

1 个答案:

答案 0 :(得分:0)

我对tidyverse软件包不太熟悉,所以这里有一个基本的R例子,让我知道tidyverse等价物。

基本要点是:

  • 将输入数据映射到输入控件
  • 将相关控件分组到列表中
  • 对于每个组,从子控件列表中构建tabPanel
  • tabsetPanel s
  • 列表中构建tabPanel

此示例使用:

  • apply映射data.frame
  • tapply分组列表元素
  • lapply映射列表
  • do.call使用列表
  • 将args传递给函数
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)
相关问题