PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

wiele wartości selectInput tworzy nieoczekiwane zachowanie dplyr (postgres)

Problem polega na sposobie skonstruowania zapytania, gdy wybierzesz tylko jedno i użyj IN operator. dplyr tłumaczenie na SQL nie dodaje właściwego nawiasu, a zatem kończy się niepowodzeniem. Ten problem został szczegółowo omówiony tutaj .

Jednym ze sposobów na obejście tego jest przekazanie innej instrukcji do filter() kiedy length wejścia jest równe 1 (patrz przykład poniżej).

Oto, co się dzieje:

tbl(mydb, "iris") %>%
  filter(Species %in% c("setosa", "versicolor")) %>%
  .$query

Daje właściwy SQL składnia zapytania:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species"
FROM "iris"
WHERE "Species" IN ('setosa', 'versicolor')
<PostgreSQLConnection>

A jeśli zostanie wykonany, daje oczekiwane:

#Source: postgres 9.3.13 [[email protected]:5432/csvdump]
#From: iris [100 x 5]
#Filter: Species %in% c("setosa", "versicolor") 
#
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#          (dbl)       (dbl)        (dbl)       (dbl)   (chr)
#1           5.1         3.5          1.4         0.2  setosa
#2           4.9         3.0          1.4         0.2  setosa
#3           4.7         3.2          1.3         0.2  setosa
#4           4.6         3.1          1.5         0.2  setosa
#5           5.0         3.6          1.4         0.2  setosa
#6           5.4         3.9          1.7         0.4  setosa
#7           4.6         3.4          1.4         0.3  setosa
#8           5.0         3.4          1.5         0.2  setosa
#9           4.4         2.9          1.4         0.2  setosa
#10          4.9         3.1          1.5         0.1  setosa
#..          ...         ...          ...         ...     ...

Zobaczmy, co się stanie, jeśli spróbujesz przekazać pojedynczy element:

tbl(mydb, "iris") %>%
  filter(Species %in% "setosa") %>%
  .$query

Zapytanie będzie wyglądało następująco:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species"
FROM "iris"
WHERE "Species" IN 'setosa'
<PostgreSQLConnection>

Które, jeśli zostanie wykonane, spowoduje następujący błąd:

Dzieje się tak, ponieważ dla pojedynczego elementu dplyr tłumaczenie na SQL zapytanie nie dodaje odpowiedniego nawiasu. Zwróć uwagę, jak to jest 'setosa' zamiast ('setosa') .

Aby to obejść, możemy zrobić:

if(length(input$Species) == 1) { 
  tbl(mydb, "iris") %>% 
    filter(Species == input$Species) %>% 
}

Który zbuduje poprawny składniowo SQL zapytanie:

<Query> SELECT "Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width", "Species" 
FROM "iris" 
WHERE "Species" = 'setosa' 
<PostgreSQLConnection>

Poniższy przykład pozwala obejść ten problem. Tutaj po prostu instruuję aplikację, aby przekazywała filter(Species == ...) if input$Species ma length 1 i filter(Species %in% ...) Inaczej.

Błyszcząca aplikacja

server <- function(input, output) {

  selectedQuery <- reactive({

    if(length(input$Species) == 1) { 
      tbl(mydb, "iris") %>% 
        filter(Species == input$Species) %>% 
        .$query
    }
    else(
      tbl(mydb, "iris") %>% 
        filter(Species %in% input$Species) %>% 
        .$query
      )

  })

  selectedData <- reactive({

    if(length(input$Species) == 1) {
      tbl(mydb, "iris") %>% 
        filter(Species == input$Species) %>% 
        data.frame
    }
    else(
      tbl(mydb, "iris") %>% 
        filter(Species %in% input$Species) %>% 
        data.frame
      )
  })

  output$plot <- renderPlot({
    ggplot2::qplot(Sepal.Length, Petal.Length, data = selectedData(), color = Species)
  })

  output$query <- renderPrint({
    selectedQuery()
    })
}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("Species", "Species", 
                  tbl(mydb, "iris") %>% 
                    data.frame %>% 
                    .$Species %>% 
                    unique, 
                  selected = "setosa", multiple = TRUE)
    ),
    mainPanel(
      textOutput("query"),
      plotOutput("plot")
      )
  )
)

shinyApp(ui = ui, server = server)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skonfigurować rozszerzenie Postgres?

  2. Jak przekazać parametr tabeli do tej funkcji?

  3. „OSTRZEŻENIE:znaleziono niezgodność między sl_table a pg_class”. w Słonym-I

  4. Zbieraj rekurencyjne klucze JSON w Postgres

  5. postgresql:.pgpass nie działa