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

using server outputs as input parameters in Shiny

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

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

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

服务器函数以反应式表达式开始,它创建了我们选择的向量 selection。然后有两个文本输出,它们拉取我们 selection.

的最小和最大日期值

我想做的是使用 start.date 和 end.date 输出来填充 ui 中日期输入的值参数,因此取决于您的选择select日期输入的起始点会改变。

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)

您不能 output 进入 ui 定义。使用 uiOutput,或使用 update 函数设置 values/ranges:

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)