2016-07-16 36 views
0

私は、UI側でselectInputで選択された変数を使用してサーバー側にマップデータを取り込む方法を理解しようとしています。 filteredDataによって表示される変数を手動で設定することで成功しましたが、動的に変更できる入力に対しては正しく機能しません。ユーザーの入力に基づいてマップ上に表示するためにデータをサブセット化するのに役立つ機能/ソリューションがありますか?マップへのselectInput値の受け渡し

UI.R

districts <- readOGR("location",layer) 
metadata <- read.csv("metadata.csv") 

#Prepare list of values for the selectInput boxes 
COMMUNITYSAFETY<-as.list(metadata$variable[metadata$group == "Community Safety"]) 
names(COMMUNITYSAFETY)=metadata$description[metadata$group == "Community Safety"] 

##CONTINUED FOR REST OF SELECTINPUT BOXES 

ui <- fluidPage(
    titlePanel("Map"), 
    sidebarPanel(
    selectInput("vr", "Would you like to show the variable by value or rank?", 
       c("Value" = "_v", 
        "Rank" = "_r") 
    ), 
    selectInput("group", "Select Group:", 
       c("Community Safety" = "COMMUNITYSAFETY", 
        "Demographics" = "DEMOGRAPHICS", 
        "Healthy People and Environments" = "HEALTHY_PEOPLE_ENVM", 
        "Housing" = "HOUSING", 
        "Income and Employment" = "INCOME_EMPL", 
        "Lifelong Learning" = "LIFE_LEARNING", 
        "Transportation" = "TRANSPORTATION")), 
    #if user choses Community Safety 
    conditionalPanel(
     condition = "input.group == 'COMMUNITYSAFETY'", 
     selectInput("var", "Community Safety Variables:", 
        COMMUNITYSAFETY)), 

    #repeat other conditional panels for inputs 

    mainPanel(
    tabsetPanel( 
     tabPanel("Map", leafletOutput("map", height=800)), 
     tabPanel("Histogram") 
)))) 

Server.R:

server <- function(input, output, session){ 
    filteredData <- reactive({ 
    subset(districts,select=input$var) 
    }) 

... 

    observe({ 
    leafletProxy("map", data=districts) %>% 
     addPolygons(stroke=TRUE, 
        fillColor=pal(filteredData()), 
        color="black", 
        weight=.5) 
    }) 
} 

答えて

0

私は問題はあなたがleafletProxyを使用する方法、だと思います。 ?leafletProxyと入力すると、leafletProxyにはdataというパラメータがありません。

leafletProxy(mapId、セッション=光沢:: getDefaultReactiveDomain()、 データ= NULL、deferUntilFlush = TRUE)

だから、あなたは、第二部では、あなたの場合districtsであなたのdataを追加する必要がありますあなたはすなわち、ここであなたのコード、:

addPolygons(data = districts, stroke=TRUE, 
    fillColor=pal(filteredData()), 
    color="black", weight=.5) 

あなたが心に留めておくべきことは、あなたのdistrictsが理解leaflet何かをあるべきであるということです。ヘルプpage saysそのleafletは、spパッケージのspatial classからobjectsを表示することができます。だから、あなたの地区をSpatialPolygonに変換する必要があります。

行列がlat lngの列であると仮定すると、各エントリはポリゴンのノード/ポイントの1つです。この関数は、行列をマップに表示するための望ましい出力に変換します。

makePoly < - 機能(myMatrix){

if (nrow(myMatrix) >= 3) { 
    # create Polygon 
    myPolygon <- Polygon(myMatrix) 

    # create Polygon List 
    myPolygonList <- Polygons(list(myPolygon), 1) 

    # create spatial Polygon 
    # why? -> can have a CRS associated with it! 
    myPolygonSpatial <- SpatialPolygons(list(myPolygonList)) 

    # assign CRS 
    proj4string(myPolygonSpatial) <- CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m [email protected] +wktext +no_defs") 

    return(myPolygonSpatial) 

} else { 
    print("Matrix to short") 
} 
0

私はあなたは、単にデータのサブセットとプロットするためのデータを使用するサブセット()関数を使用することができ、問題は非常に簡単だと思います。

は、次のコードを考えてみましょう。また

districts <- readOGR("location",layer) 
output$Map = renderLeaflet({ 
filterData = subset(districts, districts$variable = input$var) 
mapStates = map("world",region= filterData$variable, fill = TRUE, plot = FALSE) 
mapa <- leaflet(mapStates) %>% addTiles()%>% 
addPolygons(stroke = FALSE, smoothFactor = 0.2, fillOpacity = 0.5,color = "black") %>% 
setView(lng = 31, lat = 35, zoom = 1) 
}) 

、代わりに「世界」のを、あなたは、さまざまな地域/のcountiresの名前に置き換えることができます。

希望します。

関連する問題