समस्या यह है कि जब आप केवल एक . का चयन करते हैं तो क्वेरी कैसे बनाई जाती है तत्व और IN
. का उपयोग करें ऑपरेटर। dplyr
SQL
में अनुवाद उचित कोष्ठक नहीं जोड़ता है और इस प्रकार, विफल हो जाता है। इस मुद्दे पर यहां
लंबी चर्चा हुई। .
इसे हल करने का एक तरीका 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
में अनुवाद query उचित कोष्ठक नहीं जोड़ता है। ध्यान दें कि यह कैसा है '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% ...)
अन्यथा।
चमकदार ऐप
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)