如何在 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()
我正在尝试创建一个连接到数据库的 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()