我认为在一个闪亮的应用程序中使用plotGoogleMaps来动态分析和显示使用R的空间数据真的很酷。我之前从未使用任何一个包(它们相对较新)并且没有太多的编程经验,所以我从每个教程和示例开始,然后尝试将它们混合在一起。
我可以让代码的所有单个元素都能正常运行,但运行应用程序时不会显示谷歌地图。我猜它与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
})
})
我知道有光泽和plotGoogleMaps都很新,我已经看到一些建议将问题发布到闪亮的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,但现在我很怀疑我的答案就在那里。如果问题重复,请注意。我认为这是htmlOutput()
...... ?htmlOutput
稀疏......我感觉很密集......
答案 0 :(得分:4)
感谢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。
答案 1 :(得分:3)
(免责声明:不是闪亮的专家)
renderPlot适用于R图形设备。在这种情况下,plotGoogleMaps正在生成一个独立的HTML文件,该文件不会输出到图形设备。
由于plotGoogleVis生成的.html文件是独立设计的(即它们不是可以合法插入Shiny应用程序文档的文档片段),我认为你需要将它们嵌入到{{1让它们正确呈现(即将iframe
输出到文件,然后使用plotGoogleVis
)在ui.R中加载文件。
如果您的总体目标只是在地图上显示数据,那么您可能会更好地使用Leaflet - 已经有一个提供Shiny to Leaflet bindings的软件包。
答案 2 :(得分:1)
我对plotGoogleMaps
了解不多,但正如乔纳森所说,它似乎正在生成一个HTML而不是一个可用于Shiny的情节。
通过一些努力,您可以自己将Shiny绑定到Google地图。您可能希望放弃ui.R
并使用custom HTML front-end和Google地图(read 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()
功能)。