Я пытаюсь настроить ShinyApp, который может получить доступ к базе данных PostGreSQL / PostGIS и выполнять реактивные запросы в соответствии с пользовательским вводом через виджет selectInput.
Мне удается выполнить его с помощью одного ввода, следуя этому примеру(https://www.cybertec -postgresql.com / о / визуализация-данные в-с-PostgreSQL-R-блестящим / ).Мой рабочий код (извините за не представленный пример, но я не могу предоставить свой логин для базы данных в целях безопасности).
pool <- dbPool(drv = dbDriver("PostgreSQL", max.con = 100), user = "user", password = "pswd", host = "000.000.00.000", port = 5432, dbname = "db_name", idleTimeout = 3600000)
typology <- dbGetQuery(pool, "SELECT type FROM table GROUP BY type")
all_typo <- sort(unique(typology$type))
area_agripag <- dbGetQuery(pool, "SELECT area_name FROM table GROUP BY area_name")
all_area <- sort(unique(area_agripag$area_name))
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
selectInput(
inputId = "area",
label = "Select a district",
choices = all_area,
selected = 'district_1',
multiple = FALSE,
selectize = FALSE
),
selectInput(
inputId = "typo",
label = "Select a type",
choices = all_typo,
selected = 'type1',
multiple = FALSE,
selectize = FALSE
)
),
mainPanel(
tabsetPanel(
tabPanel("graph", plotOutput("plot")),
tabPanel("Table", dataTableOutput("table"))
)
)
)
)
server <- function(input, output, session) {
selectedData <- reactive({
req(input$area)
req(input$typo)
query <- sqlInterpolate(ANSI(),
"SELECT year, SUM(surface)
FROM table
WHERE area_name = ?area_name
AND type = ?type
GROUP BY year;",
area_name = input$area, type = input$typo)
outp <- as.data.frame(dbGetQuery(pool, query))
})
output$table <- DT::renderDataTable({
DT::datatable( data = selectedData(),
options = list(pageLength = 14),
rownames = FALSE)
})
output$plot <- renderPlot({
ggplot( data = selectedData(), aes(x = year, y = sum)) + geom_point()
})
}
shinyApp(ui = ui, server = server)
Что я хочу сделать, это отредактировать реактивный запрос в серверной части, чтобы разрешить несколькоselectInput.Я должен добавить оператор IN вместо = в запросе sql:
selectedData <- reactive({
req(input$area)
req(input$typo)
query <- sqlInterpolate(ANSI(),
"SELECT year, SUM(surface)
FROM table
WHERE area_name IN (?area_names)
AND type IN (?types)
GROUP BY year;",
area_names = input$area, types = input$typo)
outp <- as.data.frame(dbGetQuery(pool, query))
})
Далее я знаю, что должен отформатировать вектор area_names / types, возвращаемый множественным selectInput, с некоторым автоматическим регулярным выражением.Я хочу заключить каждый элемент вектора в '', чтобы соответствовать синтаксису SQL.Например, я хочу преобразовать следующий многократный входной вектор $ area:
area1 area2 area3
в
'area1', 'area2', 'area3'
, чтобы сохранить его в аргументе sqlInterpolate для area_names.
У кого-нибудь есть идеи, как это сделать?Спасибо всем за вклад.