Я плохо владею английским sh, поэтому предложения могут быть неправильными.
Я создаю систему для сужения элементов поиска с помощью sql.
ui.R
shinyUI(
fluidPage(
actionButton("clear", "clear"),
uiOutput("search1_ui"),
uiOutput("search2_ui"),
uiOutput("search3_ui"),
actionButton("go", "go"),
tableOutput("table")
)
)
server.R
shinyServer(function(input, output) {
output$search1_ui <- renderUI({
sql <- "SELECT DISTINCT CountryCode FROM City;"
query <- sqlInterpolate(pool, sql)
x <- dbGetQuery(pool, query)
x <- matrix(as.matrix(x), nrow(x), ncol(x))
x <- as.vector(t(x))
x <- append("", x)
selectInput("search1", "CountryCode", choices = x)
})
output$search2_ui <- renderUI({
sql <- "SELECT DISTINCT District FROM City WHERE CountryCode = ?coun;"
query <- sqlInterpolate(pool, sql, coun = input$search1)
x <- dbGetQuery(pool, query)
x <- matrix(as.matrix(x), nrow(x), ncol(x))
x <- as.vector(t(x))
x <- append("", x)
selectInput("search2", "District", choices = x)
})
output$search3_ui <- renderUI({
sql <- "SELECT DISTINCT Name FROM City WHERE CountryCode = ?coun AND District = ?dist;"
query <- sqlInterpolate(pool, sql, coun = input$search1, dist = input$search2)
x <- dbGetQuery(pool, query)
x <- matrix(as.matrix(x), nrow(x), ncol(x))
x <- as.vector(t(x))
x <- append("", x)
selectInput("search3", "Name", choices = x)
})
observeEvent(input$go,{
output$table <- renderTable({
sql <- "SELECT * FROM City WHERE CountryCode = ?coun AND District = ?dist AND Name = ?name;"
query <- sqlInterpolate(pool, sql, coun = isolate(input$search1), dist = isolate(input$search2), name = isolate(input$search3))
dbGetQuery(pool, query)
})
})
})
global.R
library(shiny)
library(DBI)
library(pool)
pool <- dbPool(
drv = RMySQL::MySQL(),
dbname = "shinydemo",
host = "shiny-demo.csa7qlmguqrf.us-east-1.rds.amazonaws.com",
username = "guest",
password = "guest"
)
В этой системе три проблемы.
1, поскольку все sql запускаются во время запуска, он становится тяжелым. Можно ли при запуске использовать только sql из «search1»?
2, «search2» работает и отображается после выбора «search1». Может ли "search3" работать и отображаться после выбора "search2"?
3, я хочу создать кнопку очистки. Можно ли отобразить только search1 и очистить данные таблицы, нажав кнопку очистки?
В работе запросы относятся к различным таблицам, поэтому вы не можете объединять запросы сразу.
Спасибо