2016-08-16 3 views
0

STORENUMBER가 데이터를 필터링하고 아래의 맵과 테이블을 렌더링하지만 DMA는 렌더링하지 않습니다. subset()은 server.r의 정수와 다른 요소에서 작동합니까?반짝이 r 부분 집합 인자 입력

데이터

STORENUMBER = c(123,456) 
DMA = c("LA","SD") 
LATITUDE = c(130, 132) 
LONGITUDE = c(30,35) 
locations = data.frame(STORENUMBER, DMA, LATITUDE, LONGITUDE) 

ui.r : 여기

 tabItem(tabName = "control", 
      fluidPage(
       titlePanel("Control Center"), 

       fluidRow(
        # the Stores are integers 
        column(6, 
         helpText("Test Stores"),         
         # test stores 
         selectInput("testStores", 
            label ="Test Stores", 
            choices = as.vector(unique(locations$STORENUMBER)), 
            selected = NULL, 
            multiple = TRUE) 
        ), 
        # the DMAs are factors 
        column(6, 
         helpText("Test DMA"), 
         selectInput("tDMA", 
            label ="Test DMAs", 
            choices = as.vector(unique(locations$DMA)), 
            selected = NULL, 
            multiple = TRUE) 
        ) #column 
       ), #fluidRow 


       fluidRow(
       titlePanel("Map"), 
       leafletOutput("map"), 
       p(), 
       actionButton("recalc", "New points") 
       ) , 


       fluidRow(
       titlePanel("Test Store Table"), 
       column(12, 
         DT::dataTableOutput("tableteststores") 
       ) 
      ) 

      ) #fluidPage 
      ) 

서브셋() 함수를 나타내는 server.r 스크립트이다.

server.r :

shinyServer(function(input, output){ 
    # not sure why DMA isn't working 
    tstores <- reactive({ 
    subset(locations, DMA %in% input$tDMA | STORENUMBER %in% input$testStores) 
    }) 


    # table of locations 
    output$tableteststores <- DT::renderDataTable(DT::datatable(
    data <- as.data.frame(tstores()) 
)) 

    # map 
    output$map <- renderLeaflet({ 
    leaflet() %>% 
     addProviderTiles("Stamen.TonerLite", 
         options = providerTileOptions(nonWrap = TRUE) 
         ) %>% 
     addMarkers(data = tstores()) 
    }) 
}) 
+0

테스트 데이터를 제공하지 않았으므로이 문제는 [reproducible] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)이 아닙니다. 정확히 "렌더링하지 않는다"는 것은 무엇을 의미합니까? 오류가 있습니까? 귀하가 선택한 DMA 값이 귀하에게 표시되었거나 숫자를 보여주고 있습니까? – MrFlick

+0

이제 테스트 데이터를 추가하여 재현 할 수 있습니다. 양식 필드에서 입력 개체를 볼 수 있지만 DMA를 선택하면지도 개체와 tableteststores 개체가 데이터를 반환하지 않습니다. STORENUMBER를 선택하면지도와 태블릿 저장소에서 개체를 반환합니다. 따라서 subset() 함수는 정수 STORENUMBER에 대해 작동하지만 DMA 요인에 대해서는 작동하지 않습니다. 너의 생각에 개방적이야. 감사. – JL82559

+0

제공하신 코드에 어떤 종류의 오류도 복제 할 수 없습니다. DMA를 통한 필터링은 정상적으로 작동하는 것 같습니다. – MrFlick

답변

0

데이터는 반응() 함수의 SQL 문으로 쿼리됩니다. SQL 문에서 WHERE 절에 인수를 "입력"변수로 전달할 때 R은 ("this", "that", "then"과 같은) 큰 따옴표 안에있는 요소의 벡터를 전달하지만 실행을위한 SQL의 인수는 WHERE 절에서 ('this', 'that', 'then'과 같은) 작은 따옴표로 전달하십시오. reactive() 함수 내에서 SQL을 사용할 계획이라면 이처럼 입력 변수를 작성하여 큰 따옴표를 작은 따옴표로 대체하는 것을 고려하십시오. 질문에 도시되지는 않았지만

library(RODBC)  

myconn <- odbcConnect('server', uid="user", pwd="password") 

reactive({ 
    data <- as.data.frame(sqlQuery(myconn, 
     paste(
      "SELECT 
        STORENUMBER 
        ,DMA 
        ,LATITUDE 
        ,LONGITUDE 
      FROM database.datatable 
      WHERE DMA in", 
          #this is a way to replace double quotes as single quotes# 
          #when passing a list or vector of factors# 
          cat("('",paste(input$DMA, collapse="','"), "')"), " 
      OR STORENUMBER in", 
          # the issue doesn't appear when passing integer types# 
          input$STORENUMBER) 
}) 

이 내 코드의 문제 것처럼 보인다. 위의 설명에서 설명하는 것처럼 질문의 코드는 올바르게 작동합니다. 이는 코드가 실패하는 reactive() 함수에서 SQL을 수행하려고 할 때만 해당됩니다. 그 이유는이 해답에서 설명하고 해결책은 여기에 나와 있습니다. 희망이 도움이됩니다.