Выбирать из одного столбца и передавать значения другого столбца

Я пытаюсь выбрать несколько значений из столбца 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, чтобы разрешить множественный выбор в запросе.


person R noob    schedule 30.08.2020    source источник


Ответы (1)


Я упростил ваше реактивное выражение, добавил Geo в качестве начального выбора и переместил selectizeInput на серверную сторону. Попробуй это.

РЕДАКТИРОВАТЬ: Я обновил ответ, чтобы удалить первоначальный выбор.

  ###### updated answer on 8Sep2020
  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))
  
  
  ui = fluidPage(
    fluidRow(
      wellPanel(
        uiOutput("regionorgeo")
      )),
    fluidRow(DTOutput('table')),
  )
  
  server = function(input, output, session){
    
    output$regionorgeo <- renderUI({
  
      selectizeInput(
        'Geo',
        label = "Geo Select",
        choices = survey$geo,
        selected=1,
        options = list(
          placeholder = 'Geo Region',
          maxOptions = 1000,
          maxItems = 10,
          searchConjunction = 'and'
        )
      )
      
    })
    
    geonamesdata <- reactive({
      req(input$Geo)
      data <- filter(survey, geo %in% as.character(input$Geo))
      data
    })
    
    output$table <- DT::renderDataTable(geonamesdata(),
                                        selection = 'single',
                                        options = list(searching = FALSE,pageLength = 10),
                                        server = FALSE, escape = FALSE,rownames= FALSE)
    
  }
  
  shinyApp(ui, server)

output

person YBS    schedule 30.08.2020
comment
Здравствуйте, YBS. Можно ли это сделать без переключателей? - person R noob; 08.09.2020
comment
Ладно, может быть, я недостаточно ясно выразился. Я хотел бы выбрать имя, но передать соответствующее географическое положение в запрос MySQL. Причина в том, что некоторые имена со специальными символами не возвращают никаких результатов на моей реальной платформе. В любом случае я могу выбрать, например, Северозапа, но в запрос MySQL передается значение BG31? - person R noob; 08.09.2020
comment
@Rnoob, в этом случае просто передайте geonamesdata()$geo в MySQL в своем коде. - person YBS; 08.09.2020
comment
Здравствуйте, YBS, я отредактировал свой вопрос новым кодом, чтобы попытаться показать, чего я хотел бы достичь с помощью запросов MySQL. Дайте мне знать, если это более понятно - person R noob; 10.09.2020