2016-07-16 16 views
0

Ich versuche herauszufinden, wie die über selectInput auf der UI-Seite ausgewählten Variablen verwendet werden, um die Kartendaten auf der Serverseite aufzufüllen. Obwohl es mir gelungen ist, Variablen manuell so festzulegen, dass sie über filteredData angezeigt werden, funktioniert sie nicht ordnungsgemäß für Eingaben, die sich dynamisch ändern können. Gibt es eine Funktion/Lösung, die dazu beitragen kann, dass die Daten basierend auf Benutzereingaben auf der Karte angezeigt werden?Übergeben von SelectInput-Werten zum Zuordnen

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

Antwort

0

ich glaube, das Problem ist, wie Sie leafletProxy verwenden. Geben Sie ?leafletProxy ein und Sie werden sehen, dass leafletProxy keinen data Parameter hat!

leafletProxy (mapId, session = glänzend :: getDefaultReactiveDomain(), data = NULL, deferUntilFlush = TRUE)

So brauchen Sie Ihre data in Ihnen Fall hinzufügen districts im zweiten Teil Sie Ihren Code, und zwar hier:

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

Was Sie beachten sollten, ist, dass Ihr districts etwas sein sollte leaflet versteht. Die Hilfe page says, die leaflet kann objects aus dem spatial class des SP-Pakets anzeigen. Sie müssen also Ihren Bezirk in eine SpatialPolygon konvertieren.

Angenommen, Sie haben eine Matrix mit lat lng Spalten, wobei jeder Eintrag einer der Knoten/Punkte Ihres Polygons ist, konvertiert diese Funktion die Matrix in die gewünschte Ausgabe für die Anzeige auf der Karte.

makePoly < - Funktion (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

ich glaube, das Problem ist sehr einfach, können Sie einfach die Teilmenge() Funktion verwenden, um die Daten der Teilmenge und die Daten zum Zeichnen verwenden.

Betrachten Sie den folgenden Code ein:

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

Auch anstelle von „Welt“ Sie es mit den Namen der verschiedenen Regionen/countires ersetzen können.

Hoffe das hilft :)