Я пытаюсь выбрать несколько значений из столбца MySQL и Shiny. Некоторые имена со специальными символами не возвращают значения при запросе из базы данных Mysql. Как выбрать имена, но передать запросу гео вместо имен.
library(shiny)
library(dplyr)
library(sqldf)
library(DT)
library(stringr)
survey <- data.frame("name" = c("Oberösterreich", "Северозападен", "Κύπρος", "Strední Cechy",
"Severovýchod", "Praha"),
"geo" = c("AT31", "BG31", "CY00", " CZ02", "CZ05", "CZ01"),
"population" =c(100409314, 54086980, 30961705, 164741605, 156857074, 93166890))
shinyApp(
ui = fluidPage(
fluidRow(
wellPanel(
selectizeInput(
'Region',
label = "Region Select",
choices = NULL,
options = list(
placeholder = 'Select Region',
maxOptions = 1000,
maxItems = 10,
searchConjunction = 'and'
)
))),
fluidRow(DT::dataTableOutput('table')),
),
server = function(input, output, session){
updateSelectizeInput(session,
"Region",
server = TRUE,
choices = survey$`name`)
geonamesdata <- reactive({
SelectedRegion <-
stringr::str_c(stringr::str_c("'", input$Region, "'"), collapse = ',')
sqldf(paste0("
SELECT DISTINCT c.name, c.geo
FROM survey c
WHERE c.name IN (",
SelectedRegion,
")
"))
})
output$table <- DT::renderDataTable(geonamesdata(),
selection = 'single',
options = list(searching = FALSE,pageLength = 10),
server = FALSE, escape = FALSE,rownames= FALSE)
})
РЕДАКТИРОВАТЬ
Я придумал еще одну демонстрацию, чтобы проиллюстрировать то, что мне нужно.
У меня есть база данных MySQL, но для ответа на этот вопрос я буду использовать SQLDF, синтаксис которого аналогичен среде Shiny.
library(shiny)
library(dplyr)
library(sqldf)
library(DT)
library(stringr)
df <- data.frame(empName = c("Jon", "Bill", "Maria"),
empID = c("J111", "B222", "M333"),
empAge = c(23, 41, 32),
empSalary = c(21000, 23400, 26800)
)
shinyApp(
ui = fluidPage(
selectizeInput("Search", label = p("Select name"),
choices = as.character(df$empName),
multiple = TRUE),
hr(),
fluidRow(
column(6, DT::dataTableOutput("table1")),
column(6, DT::dataTableOutput("table2"))),
hr(),
hr(),
fluidRow(
column(6, DT::dataTableOutput("table3")),
column(6, DT::dataTableOutput("table4"))
)),
server = function(input, output, session) {
output$table1 = DT::renderDataTable({ df }, options = list(dom = 't'))
df2 <- reactive ({
(df %>% filter(empName %in% input$Search)%>% select(empID))
})
output$table2 = DT::renderDataTable({
req(input$Search)
df2()}, options = list(dom = 't'))
df3 <- reactive({
if (input$Search != "") {
sqldf(paste0("SELECT *
FROM df WHERE empName LIKE '%",input$Search,"%'"))
}})
output$table3 = DT::renderDataTable({
req(input$Search)
df3()}, options = list(dom = 't'))
df4 <- reactive ({
SelectedNames <-stringr::str_c(stringr::str_c("'", input$Search, "'"), collapse = ',')
sqldf(paste0("SELECT empAge, empSalary
FROM df WHERE empName IN (",SelectedNames,") "))
})
output$table4 = DT::renderDataTable({
req(input$Search)
df4()}, options = list(dom = 't'))
})
Я работаю с MySQL-запросами. В таблице 1 отображаются данные для всего фрейма данных сотрудника, я не могу этого сделать для тысяч строк.
В таблице 2 я выбираю имена сотрудников из списка select, но отображаю соответствующие идентификаторы.
В таблице 3 показано только одно выбранное значение из выборки.
В таблице 4 код позволяет запрашивать другие детали из множественного выбора selectizeInput.
Я ищу возможность выбрать несколько имен из selectizeInput, но передать соответствующие идентификаторы нескольких сотрудников в запрос Mysql, чтобы получить результаты, как в таблице 4.
Таким образом, в основном объединяется возможность выбора имен, но с передачей значений столбца Id, чтобы разрешить множественный выбор в запросе.