Это похоже на вопрос, который я задал и впоследствии разработал ответ на здесь .Большие изменения (как и ожидалось) происходят на сервере.
Ничего не нужно менять в пользовательском интерфейсе, но, как вы увидите ниже, я включил еще один textOutput
, чтобы вы могли видеть даты, которые вы в конечном итогевыбрав, и я также добавил actionButton
, который я объясню позже.
У функции сервера есть пара дополнений, которые я сначала опишу, а затем соберу в конце.Вы правы, что вам нужно создать список входных объектов внутри renderUI
, что вы можете сделать с помощью lapply
.На этом шаге вы создаете столько selectInput
s, сколько у вас будет точек отсечения, минус один, потому что вы говорите, что вам не нужно последнее:
output$period_cutpoints<-renderUI({
req(input$num_periodsnr)
lapply(1:(input$num_periodsnr-1), function(i) {
selectInput(inputId=paste0("cutpoint",i),
label=paste0("Select cutpoint for Time Period ", i, ":"),
choices=dates)
})
})
Далее вам нужнополучить доступ к значениям, выбранным в каждом, что вы можете сделать таким же образом, используя объект reactiveValues
, который вы сначала создали, и назначить ему новые значения.В моей версии этой проблемы я не мог понять, как получить список для обновления без использования actionButton
для его запуска.Простой reactive()
или observe()
не справляется с задачей, но я не знаю, почему.
seldates <- reactiveValues(x=NULL)
observeEvent(input$submit, {
seldates$x <- list()
lapply(1:(input$num_periodsnr-1), function(i) {
seldates$x[[i]] <- input[[paste0("cutpoint", i)]]
})
})
Полный рабочий код приложения выглядит следующим образом:
library(shiny)
ui = shinyUI(fluidPage(
titlePanel("Defining time periods"),
sidebarLayout(
sidebarPanel(
numericInput("num_periodsnr", label = "Desired number of time periods?",
min = 1, max = 10, value = 2),
uiOutput("period_cutpoints"),
actionButton("submit", "Submit")
),
mainPanel(
textOutput("nr_of_periods"),
textOutput("cutpoints")
)
)
))
server = shinyServer(function(input, output, session) {
library(lubridate)
output$nr_of_periods <- renderPrint(input$num_periodsnr)
dates <- seq(ymd('2016-01-02'), ymd('2017-12-31'), by = '1 week')
output$period_cutpoints<-renderUI({
req(input$num_periodsnr)
lapply(1:(input$num_periodsnr-1), function(i) {
selectInput(inputId=paste0("cutpoint",i),
label=paste0("Select cutpoint for Time Period ", i, ":"),
choices=dates)
})
})
seldates <- reactiveValues(x=NULL)
observeEvent(input$submit, {
seldates$x <- list()
lapply(1:(input$num_periodsnr-1), function(i) {
seldates$x[[i]] <- input[[paste0("cutpoint", i)]]
})
})
output$cutpoints <- renderText({as.character(seldates$x)})
})
shinyApp(ui = ui, server = server)