2016-08-16 4 views
0

Die STORENUMBER-Filter die Daten und rendert die Karte und Tabelle unten, aber die DMA nicht. Funktioniert subset() auf Faktoren anders als ganze Zahlen in server.r?glänzend r Teilmenge Faktor Eingabe

Daten

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 
      ) 

Hier ist die server.r Skript die Teilmenge() Funktion zeigt.

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

Sie haben keine Testdaten geliefert, daher ist dieses Problem nicht [reproduzierbar] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Was genau meinst du damit, dass es "nicht rendert"? Erhalten Sie einen Fehler? Zeigt Ihre Auswahl die erwarteten DMA-Werte an oder zeigt sie Ihnen Zahlen an? – MrFlick

+0

Testdaten hinzugefügt, so dass jetzt reproduzierbar ist. Ich kann Eingabeobjekte im Formularfeld sehen, aber wenn ein DMA ausgewählt wird, gibt das Map-Objekt und das Tableteststores-Objekt keine Daten zurück. Wenn Sie STORENUMBER auswählen, geben die Map- und Tableteststores Objekte zurück. So scheint es, dass die Funktion subset() für die Ganzzahlen STORENUMBER funktioniert, aber nicht für die Faktoren DMA. Offen für deine Gedanken. Vielen Dank. – JL82559

+0

Ich kann keinen Fehler mit dem von Ihnen bereitgestellten Code replizieren. Filterung durch DMA scheint gut zu funktionieren. – MrFlick

Antwort

0

die Daten mit einer SQL-Anweisung in der reaktiven() Funktion abgefragt wird. Bei der Übergabe von Faktoren als "Eingabe" -Variablen in der WHERE-Klausel der SQL-Anweisung übergibt R einen Vektor von Faktoren in Anführungszeichen ("this", "that", "then"), aber für die SQL-Ausführung benötigt er die Faktoren to mit einfachen Anführungszeichen ('this', 'that', 'then') in der WHERE-Klausel übergeben werden. Erwägen Sie, die Eingabevariablen wie folgt zu schreiben, um die doppelten Anführungszeichen durch einfache Anführungszeichen zu ersetzen, wenn Sie planen, SQL innerhalb der reactive() -Funktion zu verwenden.

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

Obwohl nicht in der Frage gezeigt, scheint dies das Problem mit meinem Code gewesen zu sein. Wie die Kommentare oben erklären, funktioniert der Code in der Frage gut. Wenn der Code in einer reactive() - Funktion ausgeführt wird, schlägt der Code fehl. Der Grund wird in dieser Antwort erklärt und eine Lösung wird hier gezeigt. Hoffe das hilft.