[英]IN SQL operator in R-Shiny
I am taking multiple selection for component as per below code. 我正在按照以下代码对组件进行多项选择。
selectInput("cmpnt",
"Choose Component:",
choices = as.character(levels(Material_Data()$CMPNT_NM)),multiple = TRUE)
But I am trying to write a sql statement as given below, then its not working. 但我正在尝试编写如下所示的sql语句,然后它无法正常工作。 Neither it is throwing any error message.
它既没有抛出任何错误信息。 When I was selecting one option at a time (without mutiple = TRUE) then it was working (since I was using "=" operator).
当我一次选择一个选项(没有mutiple = TRUE)时,它正在工作(因为我使用“=”运算符)。 But after using "multiple=TRUE" I need to use IN operator, which is not working.
但在使用“multiple = TRUE”之后我需要使用IN运算符,这是无效的。
Input_Data2 <- fn$sqldf( paste0( "select * from Input_Data1 where MTRL_NBR = '$mtrl1' and CMPNT_NM in ('$cmpnt1')") )
Thanks in advance for any help on this. 在此先感谢任何帮助。
Thanks jdharrison! 谢谢jdharrison! Pleasefind the detailed code:
请查看详细代码:
# server.R
library(RODBC)
library(shiny)
library(sqldf)
Input_Data <- readRDS("InputSource.rds")
Mtrl <- factor(Input_Data$MTRL_NBR)
Mtrl_List <- levels(Mtrl)
shinyServer(function(input, output) {
# First UI input (Service column) filter clientData
output$Choose_Material <- renderUI({
if (is.null(clientData()))
return("No client selected")
selectInput("mtrl",
"Choose Material:",
choices = as.character(levels(clientData()$MTRL_NBR)),
selected = input$mtrl
)
})
# Second UI input (Rounds column) filter service-filtered clientData
output$Choose_Component <- renderUI({
if(is.null(input$mtrl))
return()
if (is.null(Material_Data()))
return("No service selected")
selectInput("cmpnt",
"Choose Component:",
choices = as.character(levels(Material_Data()$CMPNT_NM)),multiple = TRUE)
})
# First data load (client data)
clientData <- reactive({
# get(input$Input_Data)
return(Input_Data)
})
# Second data load (filter by service column)
Material_Data <- reactive({
dat <- clientData()
if (is.null(dat))
return(NULL)
if (!is.null(input$mtrl)) # !
dat <- dat[dat$MTRL_NBR %in% input$mtrl,]
dat <- droplevels(dat)
return(dat)
})
output$Choose_Columns <- renderUI({
if(is.null(input$mtrl))
return()
if(is.null(input$cmpnt))
return()
colnames <- names(Input_Data)
checkboxGroupInput("columns", "Choose Columns To Display The Data:",
choices = colnames,
selected = colnames)
})
output$text <- renderText({ print(input$cmpnt) })
output$data_table <- renderTable({
if(is.null(input$mtrl))
return()
if (is.null(input$columns) || !(input$columns %in% names(Input_Data)))
return()
Input_Data1 <- Input_Data[, input$columns, drop = FALSE]
cmpnt1 <- input$cmpnt
mtrl1 <- input$mtrl
Input_Data2 <- fn$sqldf( paste0( "select * from Input_Data1 where MTRL_NBR = '$mtrl1' and CMPNT_NM in ('$cmpnt1')") )
head(Input_Data2, 10)
})
})
Actually I am looking for character input check in table. 其实我正在寻找表中的字符输入检查。 That's why I want to check "IN" operator in sql staement.
这就是我想在sql staement中检查“IN”运算符的原因。 Is there any issue with below statement:
以下声明是否有任何问题:
CMPNT_NM in ('$cmpnt1')
library(shiny)
library(sqldf)
myDf <- data.frame(a = 1:10, b = letters[1:10])
runApp(list(
ui = bootstrapPage(
selectInput('let', 'Pick some letters', letters[1:10], multiple = TRUE),
tableOutput('table')
),
server = function(input, output) {
output$table <- renderTable({
dumLET <- input$let
print(fn$paste("select * from myDf where b IN ('$dumLET')"))
fn$sqldf("select * from myDf where b IN ('$dumLET')")
}
)
}
)
)
Running this simple example selecting one letter it works. 运行这个简单的例子,选择一个有效的字母。 More then one letter
超过一个字母
[1] "select * from myDf where b IN ('a')"
[1] "select * from myDf where b IN ('c(\"a\", \"e\")')"
Warning in matrix(align.tmp[(2 - pos):(ncol(x) + 1)], nrow = nrow(x), ncol = ncol(x) + :
data length exceeds size of matrix
[1] "select * from myDf where b IN ('c(\"a\", \"e\", \"c\")')"
Warning in matrix(align.tmp[(2 - pos):(ncol(x) + 1)], nrow = nrow(x), ncol = ncol(x) + :
data length exceeds size of matrix
[1] "select * from myDf where b IN ('c(\"a\", \"e\", \"c\", \"d\")')"
Note the 请注意
select * from myDf where b IN ('c(\\"a\\", \\"e\\", \\"c\\")')
A simple fix for this is to replace 一个简单的解决方法是更换
dumLET <- input$let
# with
dumLET <- paste(input$let, collapse = '\',\'')
So try replacing 所以尝试替换
cmpnt1 <- input$cmpnt
#with
cmpnt1 <- paste(input$cmpnt, collapse = '\',\'')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.