如何在 UI 输入小部件中使用 R Shiny 响应式服务器对象

How to use R Shiny reactive server objects in UI input widgets

我正在尝试创建一个连接到数据库的 Shiny 应用程序,但用户可以修改 IP 等。

简而言之,我只是想知道,是否有可能拥有一个闪亮的应用程序,其中包含 UI select 输入中的 reactiv 服务器部分的对象。

像这样:

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)

当它工作时,它应该是这样的:

我知道,我可以通过在 UI 之前构建 DF 来实现这种效果,但我的实际问题有点复杂:

我希望用户输入IP、用户名、密码和数据库名称,以连接到数据库。 单击按钮后,应建立连接并且 df.国家应该从 DB 中撤出,而不是构建。 我认为,我必须在(反应式)服务器部分执行此部分,因为我在数据库连接中使用 Input$x。

我希望,我的愿景在某种程度上是可能的,你们可以帮助我, 谢谢

您可以使用 updateSelectInput() 从应用的服务器端更新 select 输入更多信息,请参见此处: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()