2013-08-07 177 views
7

我認爲在一個閃亮的應用程序中使用plotGoogleMaps來動態分析和顯示空間數據是非常酷的。我以前從未使用過任何一個包(它們相對較新)並且沒有太多編程經驗,所以我從每個教程和示例開始,然後嘗試將它們混合在一起。plotGoogleMaps閃亮的應用程序

我可以獲取代碼的所有單個元素,但運行該應用程序不會顯示谷歌地圖。我猜它與plotGoogleMaps試圖在瀏覽器中繪圖並試圖在瀏覽器中渲染繪圖有關,但我不知道如何解決此問題。我把最閃亮的代碼從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 
    }) 
}) 

我瞭解雙方有光澤和情節的Google Maps很新,我也看到了一些建議向閃亮的Google小組發送問題,但我不想加倍張貼,而StackOverflow是我的答案。我最終還想對迄今爲止幫助過我的社區做出小貢獻!如果這僅僅是一個糟糕的做法我很開放的替代品,我現在退房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張貼之前幾次,但現在我懷疑我的答案在那裏。如果問題重複,則爲Appologies。我覺得這件事情與htmlOutput() ... ?htmlOutput是稀疏的...我感覺密...

回答

2

(免責聲明:沒有一個閃亮的專家)

renderPlot與R圖形設備工作。在這種情況下,plotGoogleMaps正在生成獨立的HTML文件,該文件不會輸出到圖形設備。

由於plotGoogleVis生成的.html文件是獨立設計的(即它們不是可以合法插入到Shiny應用程序文檔中的文檔片段),所以我認爲您需要將它們嵌入到iframe讓他們正確渲染(即將plotGoogleVis輸出到文件,然後使用tags$iframe以ui.R加載文件)。

如果您的總體目標僅僅是將地圖上的數據可視化,那麼您可能對Leaflet有更好的運氣 - 已經有一個包提供Shiny to Leaflet bindings

+0

感謝您的快速回復!我找不到'plotGoogleVis',有'plotGoogleMap'(我正在使用)有'googleVis'(我提到過)... iframe看起來很有幫助,新領域,我會試着回去......我也不知道單張,如果任何一項工作都會接受的話。謝謝! –

0

我對plotGoogleMaps瞭解不多,但Jonathan說它似乎在生成HTML,而不是您可以用於Shiny的情節。

通過一點努力,您可以將Shiny自動綁定到Google Maps。您可能想要溝通ui.R,並使用帶有Google地圖的custom HTML front-endread up on the Google Map developer guide here)。你的頁面將會像這樣開始(直接來自Google的「hello world」示例):

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

在一個單獨的JavaScript文件中包含這一點,並在HTML頁面的頭部加載它。

您需要編輯renderValue(),以便在地圖上顯示來自R的任何數據。每次更新地圖時都會調用renderValue()。要了解如何在地圖上實際顯示積分(或顯示的任何內容),請再次查看Google的文檔(e.g. here),該文檔通常提供大部分您需要的代碼。

現在在R的一面,你會有這樣的事情在server.R

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

在那裏你將任何數據發送到地圖繪製(通過renderValue()功能)。

3

感謝ramnathv's code我設法嵌入閃亮plotGoogleMaps沒有任何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" 
    ) 
    }) 
    } 
)) 

注意的是,傳說中不顯示。其他地方我已經有posted a question about this issue

相關問題