我找到了两个关于将传单地图保存为闪亮的答案:
他们的核心思想是用
mapshot()
代替webshot()
。在本例中,使用 cliprect
参数设置屏幕截图大小。它定义了一个与观察口的高度和宽度相匹配的剪切矩形。所以,如果cliprect = 'viewport'
,我想,屏幕截图上的地图将看起来像在我的屏幕上。但事实并非如此。
我尝试使用上面示例中的代码,他们给出了相同的结果。
这就是为什么我的问题是:是否可以在 R Shiny 中更改传单地图屏幕截图大小,如果可以,如何做到?
编辑: 原始答案下载了最初渲染的地图,没有考虑用户与地图的交互。我使用 this answer 更新了我的答案,因此下载反映了用户看到的地图。
library(leaflet)
library(mapview)
library(shiny)
ui <- fluidPage(
# 1. js to get width/height of map div
tags$head(tags$script('
var dimension = [0, 0];
$(document).on("shiny:connected", function(e) {
dimension[0] = document.getElementById("map").clientWidth;
dimension[1] = document.getElementById("map").clientHeight;
Shiny.onInputChange("dimension", dimension);
});
$(window).resize(function(e) {
dimension[0] = document.getElementById("map").clientWidth;
dimension[1] = document.getElementById("map").clientHeight;
Shiny.onInputChange("dimension", dimension);
});
')),
leafletOutput("map"),
downloadButton("dl", "Download Map")
)
server <- function(input, output, session) {
# reactive values to store map
vals <- reactiveValues()
# create base map
output$map <- renderLeaflet({
vals$base <- leaflet() %>%
addProviderTiles(providers$OpenStreetMap) %>%
addTiles()
})
# create map as viewed by user
observeEvent({
input$map_zoom
input$map_center
}, {
vals$current <- vals$base %>%
setView(lng = input$map_center$lng,
lat = input$map_center$lat,
zoom = input$map_zoom)
}
)
# create download
output$dl <- downloadHandler(
filename = "map.png",
content = function(file) {
mapshot(vals$current, file = file,
# 2. specify size of map based on div size
vwidth = input$dimension[1], vheight = input$dimension[2])
}
)
}
shinyApp(ui = ui, server = server)