如何动态生成Shiny sidebarPanel内容?

时间:2015-02-12 15:23:25

标签: r shiny shiny-server

我正在尝试创建一个应用,其中用户最初会看到一个侧边栏selectInput,其中包含一个选项列表:A,B,C和D - 由文件系统内容填充。

根据用户选择的选项,我想用选择特定的内容填充侧边栏的其余部分。例如,如果用户选择“A”,则侧边栏将包含其他selectInputdateRangeInput

为了保持代码清洁,我在handle_A.R等中保留了所有“A”特定代码。这意味着最终当我决定添加新选项“E”时,我只需要放handle_E.R中的所有代码。

ui.R

pageWithSidebar(
  headerPanel("Test"),
  sidebarPanel(
    selectizeInput("choice", "Choice:", c()),
    uiOutput("sidebar")
  ),
  mainPanel(uiOutput("main"))
)

server.R (相关位)

output$sidebar <- renderUI({
  sidebarRenderer[[input$choice]](input, output, session)
})

我在server.R中有代码来源所有handle_*.R脚本 - 每个脚本都注册了它们的回调。

到目前为止,这么好。我可以选择各种选项并调用相关的回调。但是,我不知道如何实现回调,以便在用户与侧边栏交互时更新侧边栏小部件。我想基本上执行以下操作(这不起作用,因为函数需要将某些内容返回到renderUI):

handle_A.R

sidebarRenderer[["A"]] <<- function(input, output, session) {
  selectInput("day", "Day:", c("Mon", "Wed", "Fri"))
  dates <- getDateList(input$day)
  dateRangeInput("date", "Date:", start=dates[0], end=dates[length(dates)])
  if (hasPublicHoliday(dates))
    checkboxInput("ignoreHolidays", "Ignore public holidays")
}

所以我想要的是自动将dateRangeInput更新为相应的周一/周三/周五的计算开始和结束日期。此外,如果任何日期包含公共假日,我想显示一个额外的复选框,让用户忽略公共假日。

如果有人可以帮助我,我会非常感激!

1 个答案:

答案 0 :(得分:0)

原来我需要的是将逻辑置于observe并致电updateCheckBoxInput