7

光沢のあるアプリで plotGoogleMaps を使用して、R を使用して空間データを動的に分析および表示するのは本当にクールだと思いました。どちらのパッケージも使用したことがなく (比較的新しいものです)、プログラミングの経験があまりないので、最初に次のパッケージから始めました。それぞれのチュートリアルと例を見て、それらを一緒にマッシュアップしようとしました.

コードの個々の要素をすべて動作させることができますが、アプリを実行しても Google マップが表示されません。ブラウザでプロットしようとしているplotGoogleMapsと、ブラウザでプロットをレンダリングしようとしている光沢に関係していると思いますが、これを解決する方法がわかりません。私は光沢のあるチュートリアルの入力と出力から光沢のあるコードのほとんどを引き出し、プロットに従いましたGoogleMapsチュートリアル

テストコード:

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

サーバー.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グループに質問を投稿するためのいくつかの提案を見てきましたが、二重に投稿したくないので、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-投稿する前にこの投稿を数回読みましたが、今は私の答えがそこにあるのではないかと疑っています. 質問が重複している場合はお詫びします。私はそれが何かだと思いますhtmlOutput()...?htmlOutput疎です...私は密集しています...

4

3 に答える 3

4

ramnathv のコードのおかげでplotGoogleMaps、.html プログラミングの知識がなくても、shinyに埋め込むことができました。

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

凡例は表示されないことに注意してください。私はすでにこの問題に関する質問を他の場所に投稿しました。

于 2014-06-07T16:55:48.910 に答える
1

についてはよくわかりませんplotGoogleMapsが、Jonathan が言ったように、Shiny に使用できるプロットではなく HTML を生成しているようです。

少し努力すれば、Shiny を自分で Google マップにバインドできます。あなたはおそらく捨てて、Google マップでカスタム HTML フロントエンドui.Rを使用したいと思うでしょう(ここで Google マップ開発者ガイドを読んでください)。ページは次のように始まります (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 キーを忘れずに追加してください。次に、バインディングを作成する必要があります (チュートリアルを参照してください)。開始するためのサンプルを次に示します。

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 のドキュメント (例: ここ) を再度参照してください。

R側では、次のようなものがありますserver.R

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

プロットするマップにデータを送信する場所 (renderValue()関数を介して)。

于 2013-08-09T10:20:31.770 に答える