简体   繁体   English

R-Shiny中的IN运算符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM