如何创建动态ui Rshiny

时间:2016-07-29 16:57:32

标签: r shiny shiny-server

我是Rshiny的新手,现在我尝试设计一个动态的ui Rshiny。附件是我的ui.R和server.R。它用完了一个错误。这是不同年份的数据集风暴。

ui.R
library(shiny)
library(hurricaneexposure)
library(hurricaneexposuredata)


data("hurr_tracks")
storms <- unique(hurr_tracks$storm_id)
storm_years <- as.numeric(gsub(".+-", "", storms))
storms <- storms[storm_years <= 2011]

years <- unique(storm_years)
years <- years[years<=2011]


## Split storm_id based on same year
stm <- split(storms, gsub(".+-", "", storms))


shinyUI(fluidPage(

  # Application title
  titlePanel("Hurricane"),

  sidebarLayout(
    sidebarPanel(
      selectInput("years",label = "years",years),

  # This outputs the dynamic UI component
      uiOutput("ui")
    ),
  mainPanel()
  )

))

server.R
shinyServer(function(input, output) {

output$ui <- renderUI({

switch (input$years,
  "1988"=selectInput("storm_id",label="storm_id",stm$`1988`)
)


})

正如你在ui部分看到的那样。我创造变量&#34;年&#34;和&#34; stm&#34;。 &#34;年&#34;包括1988年至2011年的所有年份。&#34; stm&#34;是一个拆分数据集,用于根据年份拆分风暴。

> head(stm)


$`1988`
[1] "Alberto-1988"  "Beryl-1988"    "Chris-1988"    "Florence-1988" "Gilbert-1988"  "Keith-1988" 
$`1989`
[1] "Allison-1989" "Chantal-1989" "Hugo-1989"    "Jerry-1989"     

我的目标是创建两个&#34; selectInput&#34;谁的名字是&#34;年&#34;和&#34;风暴&#34;。 在selectInput多年,我可以选择从1988年到2011年的年份,例如,如果我选择1989,那么第二个selectInput将只显示1989年的风暴,这是

"Allison-1989" "Chantal-1989" "Hugo-1989"    "Jerry-1989"

有什么好的建议吗?

1 个答案:

答案 0 :(得分:2)

您应该查看updateSelectInput,这是一个允许您更改已在ui端呈现的selectInputs的函数。

请查看this page了解更多详情。

有了这个,您可以拥有风暴的代理selectInput,每当年份输入发生变化时,您可以将selectInput的选项更改为正确的选项。

抱歉,我无法测试我的解决方案,因为我没有您的数据集。但试试这个想法和评论+问,如果这不适合你。

library(shiny)
library(hurricaneexposure)
library(hurricaneexposuredata)

data("hurr_tracks")
storms <- unique(hurr_tracks$storm_id)
storm_years <- as.numeric(gsub(".+-", "", storms))
storms <- storms[storm_years <= 2011]

years <- unique(storm_years)
years <- years[years<=2011]

## Split storm_id based on same year
stm <- split(storms, gsub(".+-", "", storms))

ui <- shinyUI(fluidPage(
  # Application title
  titlePanel("Hurricane"),
  sidebarLayout(
    sidebarPanel(
      selectInput("years", label = "years", years),
      selectInput("storm_id", label = "Storms", choices = NULL)
    ),
    mainPanel()
  )
))

server <- function(input, output, session) {
  observeEvent(input$years, {
    updateSelectInput(session, "storm_id", choices = stm[[input$years]])
  })
}

shinyApp(ui, server)