2016-08-16 16 views
0

STORENUMBERはデータをフィルタリングし、下のマップとテーブルをレンダリングしますが、DMAはそうしません。サブセット()は、server.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

テストデータを提供していないので、この問題は[再現可能]ではありません(http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。正確には「レンダリングしない」という意味ですか?エラーが発生していますか?選択したDMAの値が表示されているのか、数値が表示されていますか? – MrFlick

+0

テストデータを追加しましたので、再現性があります。私はフォームフィールドに入力オブジェクトを見ることができますが、DMAを選択すると、マップオブジェクトとタブレットストアのオブジェクトはデータを返しません。 STORENUMBERを選択すると、マップとタブレットストアがオブジェクトを返します。したがって、subset()関数は整数STORENUMBERに対して機能しますが、要因DMAでは機能しません。あなたの思考に開放されています。ありがとう。 – JL82559

+0

あなたが提供したコードで何らかのエラーを複製することはできません。 DMAによるフィルタリングはうまくいくようです。 – MrFlick

答えて

0

データは、反応性()関数内のSQL文で照会されます。 SQL文のWHERE句で因子を "入力"変数として渡すときは、( "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を実行しようとしているときだけです。その理由はこの答えで説明されており、その解決策がここに示されています。お役に立てれば。

関連する問題