Как последовательно добавить новые варианты в selectizeInput? - PullRequest
2 голосов
/ 07 июля 2019

Я новичок в R и Shiny и пытаюсь понять, как позволить пользователю добавлять новые «варианты» в список выбора по одному.например, если пользователь загружает наборы данных по одному, имена всех наборов данных будут тогда доступны для выбора в списке выбора.

Я сделал простую версию (см. ниже), где пользователь может добавитьодин новый «выбор» в списке.Но, очевидно, он не сохраняет каждый новый выбор, когда вы продолжаете добавлять новые варианты.

Моя попытка добавить более 1 нового варианта также приведена ниже.

#### Simple working version of adding 1 new choice ####
choices <- c("x", "y", "z")

ui <- fluidPage(
    selectizeInput("choices","Choices", choices = choices, multiple = TRUE),
    textInput("new_choices", "New choices to add"),
    actionButton("add_choices", "Add new choices")
)

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

    observeEvent(input$add_choices, {
        req(input$new_choices)
        choices <- c(choices, input$new_choices)
        updateSelectizeInput(session, "choices", choices = choices)
    })

}

shinyApp(ui = ui, server = server)



#### Not working version of sequentially adding new choices ####
choices <- c("x", "y", "z")

ui <- fluidPage(
    selectizeInput("choices","Choices", choices = choices, multiple = TRUE),
    textInput("new_choices", "New choices to add"),
    actionButton("add_choices", "Add new choices")
)

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

    temp <- reactive({
        choices
    })

    update_choices <- function() {
        temp <- reactive({
            c(temp, input$new_choices)
        })
        return(temp)
    }

    observeEvent(input$add_choices, {
        req(input$new_choices)
        temp <- update_choices()
        updateSelectizeInput(session, "choices", choices = temp)
    })

}

shinyApp(ui = ui, server = server)

Результат нерабочего кодав этом: Предупреждение: Ошибка в as.vector: невозможно принудительно привести тип «замыкание» к вектору типа «список» [нет трассировки стека]

1 Ответ

1 голос
/ 07 июля 2019

Просто добавьте реактивное значение с помощью выбора

library(shiny)

ui <- fluidPage(
  selectizeInput("choices","Choices", choices = c(), multiple = TRUE),
  textInput("new_choices", "New choices to add"),
  actionButton("add_choices", "Add new choices")
)

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

  values = reactiveValues()
  values$current_choices = c("x", "y", "z")

  observeEvent(input$add_choices, {
    req(input$new_choices)
    values$current_choices <- c(values$current_choices, input$new_choices)
  })

  observe({
    updateSelectizeInput(session, "choices", choices = values$current_choices, selected = input$choices)
  })

}

shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...