Как использовать объекты R-реактивного сервера в виджетах ввода пользовательского интерфейса

#r #input #shiny #reactive

Вопрос:

Я пытаюсь создать блестящее приложение, которое подключается к базе данных, но IP-адрес и т. Д. могут быть изменены пользователем.

Короче говоря, я просто хочу знать, возможно ли создать блестящее приложение с объектами из частей сервера реактивации, включенными во входы выбора пользовательского интерфейса.

Подобный этому:

 library(shiny)
    
    ui <- fluidPage(
    
  selectizeInput(inputId = 'inSelect',
                 label = "countries",
                 choices = getTable(),
                 multiple = TRUE,
                 options = list(maxItems = 4, 
                                placeholder = 'select up to 4 countries')
                 )
 )

server <- function(input, output) {
 
  getTable <- reactive({
    
    country <- data.frame(name=c("Germany","France","Japan"),
                          code=c("DEU","FRA","JPN"))
    countryN <- country$code
    names(countryN) <- country$name
  })
} 

shinyApp(ui = ui, server = server)
 

когда это работает, это должно выглядеть так:

введите описание изображения здесь

Я знаю, что могу достичь этого эффекта, просто создав DF перед пользовательским интерфейсом, но моя реальная проблема немного сложнее:

Я хочу, чтобы пользователь ввел IP,имя пользователя, PW и имя базы данных, чтобы подключиться к базе данных. После нажатия кнопки соединение должно быть установлено, и df. страна должна быть извлечена из базы данных, а не создана. Я думаю, что я должен выполнить эту часть в (реактивной) серверной части, потому что я использую ввод$x в соединении с БД.

Я надеюсь, что мое видение каким-то образом возможно, и вы, ребята, сможете мне помочь, спасибо.

Ответ №1:

вы можете использовать updateSelectInput() для обновления выбранного ввода со стороны сервера приложения. Дополнительная информация приведена здесь: https://shiny.rstudio.com/reference/shiny/1.2.0/updateSelectInput.html

в вашем конкретном примере вы можете достичь этого,:

 library(shiny)

ui <- fluidPage(
    
    selectizeInput(inputId = 'inSelect',
                   label = "countries",
                   choices = NA,
                   multiple = TRUE,
                   options = list(maxItems = 4, 
                                  placeholder = 'select up to 4 countries')
    )
)

server <- function(input, output,session) {
    
    getTable <- reactive({
        
        country <- data.frame(name=c("Germany","France","Japan"),
                              code=c("DEU","FRA","JPN"))
        countryN <- country$code
        names(countryN) <- country$name
        
        return(country)
    })
    
    observe({updateSelectInput(session, inputId="inSelect", label = NULL, choices = getTable()$name,
                      selected = NULL)})
    
    
} 

shinyApp(ui = ui, server = server)
 

добавляя аргумент session к функции сервера, а затем используя updateSelectInput() функцию, это должно быть завернуто в реактивное выражение в этом примере, который я использовал observe()