在Shiny中使用服务器输出作为输入参数

时间:2017-09-05 16:56:59

标签: r shiny shiny-server shinydashboard

下面您将找到一些非常简单的闪亮仪表板的代码。

它包含一个名为choice的全局列表,它有三个元素:date.1,date.2和date.3(每个都是不同的日期序列)。

UI仅包含三个输入: 一个选择输入,允许用户选择我们的全局选择之一。 一个开始日期输入 一个结束日期输入。

服务器函数以反应式表达式开始,该表达式创建我们的选择选择向量。然后有两个文本输出,它们拉出我们选择的最小和最大日期值。

我要做的是使用start.date和end.date输出来填充ui中日期输入的值参数,因此根据您选择的选项,日期输入的起点将发生变化

library(shiny)

start.date1 <- as.Date("2017-01-01","%Y-%m-%d")
end.date1 <- as.Date("2017-01-31","%Y-%m-%d")
start.date2 <- as.Date("2017-02-01","%Y-%m-%d")
end.date2 <- as.Date("2017-02-28","%Y-%m-%d")
start.date3 <- as.Date("2017-03-01","%Y-%m-%d")
end.date3 <- as.Date("2017-03-31","%Y-%m-%d")

choice <- list()
choice$date.1 <- as.character(seq(start.date1,end.date1,by="week"))
choice$date.2 <- as.character(seq(start.date2,end.date2,by="week"))
choice$date.3 <- as.character(seq(start.date3,end.date3,by="week"))

ui <- fluidPage(
  selectInput("select.scenario","select.scenario", choices = names(choice)),
  dateInput("start.date","start.date",value = textOutput("start.date")),
  dateInput("end.date","end.date",value = textOutput("end.date"))
)

server <- function(input, output) {

  dates <- eventReactive(input$select.scenario,{
    df <- choice[[as.character(input$select.scenario)]]
    })

  output$start.date <- renderText({
    df <- dates()
    start.date <- min(as.Date((df)))
    start.date
  })

  output$end.date <- renderText({
    df <- dates()
    end.date <- max(as.Date((df)))
    end.date
  })

  }

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

您无法output进入ui定义。使用uiOutput,或使用update函数设置值/范围:

library(shiny)

start.date1 <- as.Date("2017-01-01","%Y-%m-%d")
end.date1 <- as.Date("2017-01-31","%Y-%m-%d")
start.date2 <- as.Date("2017-02-01","%Y-%m-%d")
end.date2 <- as.Date("2017-02-28","%Y-%m-%d")
start.date3 <- as.Date("2017-03-01","%Y-%m-%d")
end.date3 <- as.Date("2017-03-31","%Y-%m-%d")

choice <- list()
choice$date.1 <- as.character(seq(start.date1,end.date1,by="week"))
choice$date.2 <- as.character(seq(start.date2,end.date2,by="week"))
choice$date.3 <- as.character(seq(start.date3,end.date3,by="week"))

ui <- fluidPage(
  selectInput("select.scenario","select.scenario", choices = names(choice)),
  dateInput("start.date","start.date"),
  dateInput("end.date","end.date")
)

server <- function(session, input, output) {

  dates <- eventReactive(input$select.scenario,{
    df <- choice[[as.character(input$select.scenario)]]
  })

  observeEvent(input$select.scenario, {
    updateDateInput(session, "start.date", value=min(as.Date(dates())))
    updateDateInput(session, "end.date", value=max(as.Date(dates())))
  })

}

shinyApp(ui = ui, server = server)