2013-08-07 22 views
7

मैंने सोचा कि यह चमकदार ऐप में साजिशGoogleMaps का उपयोग करने के लिए वास्तव में अच्छा होगा, ताकि आर का उपयोग करके स्थानिक डेटा का गतिशील विश्लेषण और प्रदर्शन किया जा सके। मैंने कभी भी पैकेज का उपयोग नहीं किया है (वे अपेक्षाकृत नए हैं) और अधिक नहीं है प्रोग्रामिंग अनुभव, इसलिए मैंने प्रत्येक के लिए ट्यूटोरियल और उदाहरणों के साथ शुरुआत की और फिर उन्हें एक साथ मैश करने की कोशिश की।चमकदार ऐप में plotGoogleMaps

मैं कोड के सभी व्यक्तिगत तत्वों को काम करने के लिए प्राप्त कर सकता हूं, लेकिन ऐप चलाने से Google मानचित्र प्रदर्शित नहीं होता है। मुझे लगता है कि इसे प्लॉटGoogleMaps के साथ ब्राउज़र में साजिश करने की कोशिश कर रहा है और एक ब्राउज़र में साजिश रेंडर करने की कोशिश कर रहा है, लेकिन मुझे नहीं पता कि इसे कैसे हल किया जाए। मैं the shiny tutorial Inputs & Outputs से चमकदार कोड के सबसे खींच लिया और plotGoogleMaps Tutorial

परीक्षण कोड का पालन किया:

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

मैं दोनों को समझने चमकदार और साजिशGoogleMaps बहुत नए हैं और मैंने कुछ सुझाव देखा है चमकदार Google समूह को प्रश्न पोस्ट करें, लेकिन मैं पोस्ट को डबल नहीं करना चाहता हूं और स्टैक ओवरव्लो उत्तर के लिए जाना है। मैं अंत में एक समुदाय में एक छोटा सा योगदान करना चाहता हूं जिसने मुझे अब तक बहुत मदद की है! यह सिर्फ एक घटिया दृष्टिकोण मैं विकल्प के लिए खुला रहा हूँ है, तो मैं अब googleVis बाहर की जाँच कर रहा हूँ ...

धन्यवाद, एलेक्स

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- मैं this post पढ़ पोस्ट करने से पहले कई बार, लेकिन अब संदेह है कि मेरा जवाब वहां है। यदि प्रश्न डुप्लिकेट है तो माफी माँगें। मुझे लगता है कि यह htmlOutput() साथ कुछ ... ?htmlOutput विरल है ... मैं घने महसूस कर रहा हूँ ...

उत्तर

2

(अस्वीकरण: नहीं एक चमकदार विशेषज्ञ)

renderPlot आर ग्राफिक्स डिवाइस के साथ काम करता है। इस मामले में, plotGoogleMaps एक स्टैंडअलोन HTML फ़ाइल उत्पन्न कर रहा है, जो ग्राफिक्स डिवाइस पर आउटपुट नहीं है।

के बाद से .html plotGoogleVis द्वारा उत्पन्न फ़ाइलों अकेले खड़े करने के लिए (यानी वे टुकड़े कि कानूनी तौर पर चमकदार एप्लिकेशन के दस्तावेज़ में सम्मिलित किया जा सकता है दस्तावेज़ नहीं कर रहे हैं) तैयार कर रहे हैं, मुझे लगता है कि आप उन्हें एक iframe में एम्बेड करने के लिए की आवश्यकता होगी उन्हें सही ढंग से प्रस्तुत करने के लिए प्राप्त करें (यानी plotGoogleVis आउटपुट फ़ाइल में है, और फिर फ़ाइल को tags$iframe का उपयोग करके ui.R में लोड करें)।

यदि आपका समग्र लक्ष्य मानचित्र पर डेटा को देखने के लिए है, तो आपके पास पत्रिका के साथ बेहतर भाग्य हो सकता है - पहले से ही एक पैकेज है जो Shiny to Leaflet bindings प्रदान करता है।

+0

आपके त्वरित उत्तर के लिए धन्यवाद! मुझे 'plotGoogleVis' नहीं मिल रहा है, 'plotGoogleMap' (मैं उपयोग कर रहा हूं) 'googleVis' (मैंने उल्लेख किया है) है ... iframe उपयोगी दिखता है, नया क्षेत्र, मैं कोशिश करूँगा और वापस आऊंगा ... I अगर कोई काम स्वीकार करेगा, तो भी पत्रक के बारे में नहीं पता था। धन्यवाद! –

0

मुझे plotGoogleMaps के बारे में बहुत कुछ पता नहीं है, लेकिन जोनाथन ने कहा कि ऐसा लगता है कि यह एक साजिश के बजाय एक HTML उत्पन्न कर रहा है जिसे आप चमकदार के लिए उपयोग कर सकते हैं।

कुछ प्रयासों के साथ आप चमकदार Google मानचित्र पर स्वयं को बाध्य कर सकते हैं। आप शायद ui.R को मिटाना चाहते हैं और Google मानचित्र (read up on the Google Map developer guide here) के साथ custom HTML front-end का उपयोग करना चाहते हैं।आप पृष्ठ इस तरह शुरू कर देंगे (सीधे गूगल के "हैलो दुनिया" उदाहरण से):

<!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> 

ऊपर अपनी API कुंजी में जोड़ने के लिए मत भूलना। अब आपको बाध्यकारी लिखना होगा (see tutorial)। शुरू करने के लिए यहां एक नमूना दिया गया है:

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"); 

इसे एक अलग जावास्क्रिप्ट फ़ाइल में शामिल करें और इसे HTML पृष्ठ के शीर्ष में लोड करें।

आपको renderValue() संपादित करना होगा ताकि आर से जो भी डेटा आता है, मानचित्र पर दिखाया गया हो। प्रत्येक बार नक्शा अपडेट होने पर renderValue() कहा जाएगा। मानचित्र पर वास्तव में अंक (या जो भी आप प्रदर्शित कर रहे हैं) को दिखाने के लिए, Google के दस्तावेज़ (e.g. here) पर एक नज़र डालें, जो आमतौर पर आपको आवश्यक कोड प्रदान करता है।

अब आर पक्ष पर, आप server.R में कुछ इस तरह होगा:

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

कहाँ आप नक्शे के लिए जो कुछ भी डेटा भेज देंगे (renderValue() समारोह के माध्यम से) साजिश रची जा करने के लिए।

3

ramnathv's code के लिए धन्यवाद मैं किसी भी .html प्रोग्रामिंग ज्ञान के बिना चमकदार में plotGoogleMaps एम्बेड करने में कामयाब रहे:

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

ध्यान दें कि कथा प्रदर्शित नहीं है। मेरे पास पहले से ही posted a question about this issue है।