2013-08-07 10 views
7

Pomyślałem, że byłoby naprawdę fajnie używać plotGoogleMaps w błyszczącej aplikacji do dynamicznej analizy i wyświetlania danych przestrzennych za pomocą R. Nigdy wcześniej nie używałem żadnej z tych paczek (są one stosunkowo nowe) i nie mają zbyt wiele doświadczenie programistyczne, więc zacząłem od tutoriali i przykładów dla każdego, a następnie starałem się je złączyć razem.plotGoogleMaps w błyszczącej aplikacji

Mogę sprawić, aby wszystkie poszczególne elementy kodu działały, ale uruchomienie aplikacji nie wyświetla mapy google. Zgaduję, że ma to związek z działkąGoogleMaps próbującą kreślić w przeglądarce i błyszczącą próbą renderowania fabuły w przeglądarce, ale nie wiem, jak rozwiązać ten problem. Wyciągnąłem większość błyszczące kod z the shiny tutorial Inputs & Outputs a następnie kod plotGoogleMaps Tutorial

badawczej:

#load packages and data 
library(shiny) 
library(plotGoogleMaps) 
data(meuse) 

#convert data frame to SpatialPointDataFrame and set 
coordinates(meuse)<-~x+y 
proj4string(meuse) <- CRS('+init=epsg:28992') 

#will need to select column name for app, maybe not best way to do this, 
#but seems to work 
formulaText<-paste('zinc') 

#plot data on Google map, opens browser and works 
mpgPlot <- plotGoogleMaps(meuse, zcol=formulaText) 

ui.R

library(shiny) 

# Define UI for meuse test 
shinyUI(pageWithSidebar(

    # Application title 
    headerPanel("Meuse Test"), 

    # Sidebar with controls to select the variable to plot on map 
    sidebarPanel(
     selectInput("variable", "Variable:", 
           choices=list("Zinc" = "zinc", 
             "Lead" = "lead", 
             "Copper" = "copper"), 
           selected="Zinc") 

    ), 

    # Show the caption and plot of the requested variable on map 
    mainPanel(
     plotOutput("mapPlot") 
    ) 
)) 

server.R

library(shiny) 
library(plotGoogleMaps) 

data(meuse) 
coordinates(meuse)<-~x+y 
proj4string(meuse) <- CRS('+init=epsg:28992') 

# Define server logic required to plot various variables on map 
shinyServer(function(input, output) { 

    # Compute the forumla text in a reactive expression since it is 
    # shared by the output$mapPlot ?I think I still need to do this... 
    formulaText <- reactive({ 
#paste the input name in so it follows argument format for plotGoogleMaps? 
#tried without, don't think it is probelm, works with test code... 
     paste(input$variable) 
    }) 


    # Generate a plot of the requested variable against mpg and only 
    # include outliers if requested 
    output$mapPlot <- renderPlot({ 
     plotGoogleMaps(meuse, zcol=formulaText) 
#also tried to specify alternative arguments like add=TRUE, 
#filename='mapPlot.htm', openMap=FALSE 
    }) 
}) 

rozumiem zarówno lśniące i działkaGoogleMaps są całkiem nowe i widziałem kilka sugestii publikuj pytania do błyszczącej grupy Google, ale nie chcę podwójnie pisać, a StackOverflow to moje odpowiedzi. W końcu chciałbym również wnieść niewielki wkład w społeczność, która tak bardzo mi pomogła! Jeśli jest to po prostu kiepskie podejście Jestem otwarty na alternatywy, ja sprawdzanie googleVis teraz ...

Dzięki, Alex

PS

sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] grid  stats  graphics grDevices utils  datasets methods 
[8] base  

other attached packages: 
[1] googleVis_0.4.3 plotGoogleMaps_2.0 maptools_0.8-25 
[4] lattice_0.20-15 foreign_0.8-54  rgdal_0.8-10  
[7] sp_1.0-11   shiny_0.6.0  

loaded via a namespace (and not attached): 
[1] bitops_1.0-5 caTools_1.14 digest_0.6.3 httpuv_1.0.6.3 
[5] Rcpp_0.10.4 RJSONIO_1.0-3 tools_3.0.1 xtable_1.7-1 

PPS- czytam this post kilka razy przed ogłoszeniem, ale teraz jestem podejrzliwy, moja odpowiedź jest. Appologies, jeśli pytanie jest duplikatem. Myślę, że to coś z htmlOutput() ... ?htmlOutput jest rzadki ... czuję gęsty ...

Odpowiedz

2

(disclaimer: nie błyszczące ekspert)

renderPlot współpracuje z urządzeniem graficznym R. W tym przypadku plotGoogleMaps generuje samodzielny plik HTML, który nie jest wyprowadzany na urządzenie graficzne.

Ponieważ pliki .html wygenerowane przez działkaGoogleVis są zaprojektowane jako samodzielne (tzn. Nie są fragmentami dokumentów, które można legalnie wstawić do dokumentu aplikacji Shiny), myślę, że musisz je osadzić w postaci iframe zmusić je do renderowania poprawnie (tj. mieć wyjście plotGoogleVis do pliku, a następnie załadować plik do pliku ui.R przy użyciu tags$iframe).

Jeśli Twoim głównym celem jest wizualizacja danych na mapie, możesz mieć więcej szczęścia z broszurą - jest już pakiet, który dostarcza Shiny to Leaflet bindings.

+0

Dziękujemy za szybką odpowiedź! Nie mogę znaleźć 'plotGoogleVis', tam jest 'plotGoogleMap' (używam) jest" googleVis "(wspomniałem) ... iframe wygląda na pomocny, nowe terytorium, spróbuję wrócić ... I również nie wiedział o ulotce, jeśli któraś z prac zaakceptuje. Dzięki! –

0

Niewiele wiem o plotGoogleMaps, ale jak powiedział Jonathan, wydaje się, że generuje on HTML, a nie fabułę, której można użyć do Shiny.

Z odrobiną wysiłku możesz samodzielnie powiązać Błyszczący z Mapami Google. Prawdopodobnie będziesz chciał porzucić ui.R i użyć custom HTML front-end z Mapą Google (read up on the Google Map developer guide here).Ty Page zacznie tak (prosto z „Hello World” przykład Google):

<!DOCTYPE html> 
<html> 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
    <style type="text/css"> 
     html { height: 100% } 
     body { height: 100%; margin: 0; padding: 0 } 
     #map-canvas { height: 100% } 
    </style> 
    <script type="text/javascript" 
     src="https://maps.googleapis.com/maps/api/js?key=API_KEY&sensor=SET_TO_TRUE_OR_FALSE"> 
    </script> 
    <script type="text/javascript"> 
     function initialize() { 
     var mapOptions = { 
      center: new google.maps.LatLng(-34.397, 150.644), 
      zoom: 8, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     var map = new google.maps.Map(document.getElementById("map-canvas"), 
      mapOptions); 
     } 
     google.maps.event.addDomListener(window, 'load', initialize); 
    </script> 
    </head> 
    <body> 
    <div id="map-canvas"/> 
    </body> 
</html> 

Nie zapomnij dodać w swoim kluczem API powyżej. Teraz musisz napisać powiązanie (see tutorial). Oto przykład, od którego możesz zacząć:

var map_binding = new Shiny.OutputBinding(); 

$.extend(map_binding, { 

    find: function(scope) { 
    return $(scope).find('#map-canvas'); 
    }, 

    renderValue: function(el, data) { 

    // Parse the data sent from R. 
    var map_data = jQuery.parseJSON(data); 

    // ... 
    // Render points or whatever on map. 
    /// 

    } 
}); 

Shiny.outputBindings.register(map_binding, "map_binding"); 

Dołącz to w oddzielnym pliku JavaScript i załaduj w nagłówku strony HTML.

Musisz edytować renderValue(), aby jakiekolwiek dane z R pojawiały się na mapie. renderValue() będzie wywoływane za każdym razem, gdy mapa zostanie zaktualizowana. Aby zobaczyć, jak wyświetlać na mapie punkty (lub cokolwiek innego), ponownie zapoznaj się z dokumentacją Google (e.g. here), która zazwyczaj zawiera większość potrzebnego kodu.

Teraz po stronie R, będziesz mieć coś takiego w server.R:

output$map <- renderText({ 
    RJSONIO::toJSON(some_data) 
}) 

Gdzie można wysłać niezależnie od danych na mapie, aby być wykreślone (poprzez funkcję renderValue()).

3

Dzięki ramnathv's code udało mi się umieścić plotGoogleMaps w błyszczące bez znajomości programowania html:

library(plotGoogleMaps) 
library(shiny) 

runApp(list(
    ui = pageWithSidebar(
    headerPanel('Map'), 
    sidebarPanel(""), 
    mainPanel(uiOutput('mymap')) 
    ), 
    server = function(input, output){ 
    output$mymap <- renderUI({ 
     data(meuse) 
     coordinates(meuse) = ~x+y 
     proj4string(meuse) <- CRS("+init=epsg:28992") 
     m <- plotGoogleMaps(meuse, filename = 'myMap1.html', openMap = F) 
     tags$iframe(
     srcdoc = paste(readLines('myMap1.html'), collapse = '\n'), 
     width = "100%", 
     height = "600px" 
    ) 
    }) 
    } 
)) 

Zauważ, że legenda nie jest wyświetlany. Mam już posted a question about this issue w innym miejscu.

Powiązane problemy