sql >> データベース >  >> RDS >> PostgreSQL

複数のselectInput値は、予期しないdplyr(postgres)動作を作成します

    問題は、1つのみを選択した場合のクエリの作成方法です。 要素を作成し、INを使用します オペレーター。 dplyr SQLへの変換 適切な括弧が追加されないため、失敗します。この問題については、こちら で詳しく説明されています。 。

    これを回避する1つの方法は、別の命令をfilter()に渡すことです。 lengthの場合 入力の数は1に等しい(以下の例を参照)。

    何が起こっているのか:

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

    適切なSQLを提供します クエリ構文:

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

    そして、実行された場合、期待されるものを与えます:

    #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
    #..          ...         ...          ...         ...     ...
    

    単一の要素を渡そうとするとどうなるか見てみましょう:

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

    クエリは次のようになります:

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

    これを実行すると、次のエラーが発生します:

    これは、単一の要素の場合、dplyr SQLへの変換 クエリは適切な括弧を追加しません。 'setosa'であることに注目してください ('setosa')の代わりに 。

    それを回避するために、次のことができます。

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

    構文的に有効なSQLを構築します クエリ:

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

    次の例は、この問題を回避します。ここでは、filter(Species == ...)を渡すようにアプリに指示するだけです。 input$Speciesの場合 lengthです 1およびfilter(Species %in% ...) それ以外は。

    ShinyApp

    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. MySQLで現在のトランザクションIDを取得する

    2. while($ row =mysql_fetch_assoc($ result))-$ rowをforeachする方法は?

    3. 深さの子ノードの最初のレベルのみを取得するにはどうすればよいですか?

    4. GETUTCDATE()は、同じステートメントで2回使用された場合、同じ値を返しますか?