簡體   English   中英

R-Shiny中的IN運算符

[英]IN SQL operator in R-Shiny

我正在按照以下代碼對組件進行多項選擇。

selectInput("cmpnt",
            "Choose Component:",
            choices = as.character(levels(Material_Data()$CMPNT_NM)),multiple = TRUE)

但我正在嘗試編寫如下所示的sql語句,然后它無法正常工作。 它既沒有拋出任何錯誤信息。 當我一次選擇一個選項(沒有mutiple = TRUE)時,它正在工作(因為我使用“=”運算符)。 但在使用“multiple = TRUE”之后我需要使用IN運算符,這是無效的。

Input_Data2 <- fn$sqldf( paste0( "select * from Input_Data1 where MTRL_NBR = '$mtrl1' and CMPNT_NM in ('$cmpnt1')") )

在此先感謝任何幫助。

謝謝jdharrison! 請查看詳細代碼:

# 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)
})
})

其實我正在尋找表中的字符輸入檢查。 這就是我想在sql staement中檢查“IN”運算符的原因。 以下聲明是否有任何問題:

  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')")
    }
    )
  }
)
)

運行這個簡單的例子,選擇一個有效的字母。 超過一個字母

[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\")')"

請注意

select * from myDf where b IN ('c(\\"a\\", \\"e\\", \\"c\\")')

一個簡單的解決方法是更換

dumLET <- input$let
# with      
dumLET <- paste(input$let, collapse = '\',\'')

所以嘗試替換

cmpnt1 <- input$cmpnt
#with
cmpnt1 <- paste(input$cmpnt, collapse = '\',\'')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM