将传单导出为针织文档的闪亮地图

如何解决将传单导出为针织文档的闪亮地图

我有一个闪亮的应用程序,用于可视化各种数据。产生的图之一是地图。我允许用户使用编织文档将所有绘图作为单个 Word 文档一次下载。我想在文档中包含地图,但不知道如何做到这一点。我可以使用单独的 downloadHandler 导出地图本身的 png(或 pdf),但理想情况下希望将地图包含在主文档中。任何帮助将不胜感激...如果有人对下载的地图范围(似乎与屏幕上的地图范围不匹配)有任何提示,那也太棒了。

我愿意使用 officer 将下载的地图导入到新创建的 doc 文件中,但不知道如何 a) 使用单个 downloadHandler 来完成,以及 b)告诉R如何处理最新下载的地图名称。

# reproducible example of the shiny app,mimicking the functionality and structure of the full app. 
library(shiny)
library(dplyr)
library(leaflet)
library(mapview)
library(ggplot2)

df <- structure(list(Lon = c(-111.584650079555,-112.17670350598,-111.585725614472,-112.173232931394,-111.772792415394),Lat = c(41.7797872701221,43.0098749960118,41.7489995541869,43.0096673539034,42.1053681392244),Size = c(1:5)),row.names = c(NA,-5L),class = c("tbl_df","tbl","data.frame"))

server = function(input,output){
    # baseline map
    mymap <- reactive({
      leaflet(df) %>%
        setView(lng = -111.6,lat = 41.8,zoom = 8) %>%
        addProviderTiles("Esri.WorldImagery",layerId = "basetile",options = providerTileOptions(minZoom = 8,opacity = 0.75)) })

    # to be able to use leafletproxy
    output$map <- renderLeaflet({
      mymap() })

    # quick plot to show how I'm exporting my actual plots
    plot.calc <- reactive({
      p <- ggplot(df) + geom_point(aes(x = Lon,y = Lat))
      return(p) })  
    
    output$plot <- renderPlot({
      plot.calc() })

    # helper function to use with leafleproxy,to allow for export of the user-created map
    myfun <- function(map,df.in,bounds){
        bounds <- InBounds()$bounds
        latRng <- range(bounds$north,bounds$south)
        lngRng <- range(bounds$east,bounds$west)
            
      addCircleMarkers(map,data = df.in,lng = df.in$Lon,lat = df.in$Lat,radius = ~Size * 4,color = "red")  %>%
      fitBounds(min(lngRng),min(latRng),max(lngRng),max(latRng)) 
                                            }
    
    # pull out data within the zoomed-in boundarier of the map  
    InBounds <- reactive({
        req(input$map_bounds)
            
        bounds <- input$map_bounds
        latRng <- range(bounds$north,bounds$west)
                                    
        df.in <- df %>%
                filter(Lat >= latRng[1],Lat <= latRng[2],Lon >= lngRng[1],Lon <= lngRng[2])
        output <- list(df.in = df.in,bounds = bounds) 
                            }) 
    # update map with the data within the map boundarier                        
    observe({
      leafletProxy("map") %>% myfun(InBounds()$df.in)
    })
    
    # map that will be downloaded
    mapdown <- reactive({
      bounds <- input$map_bounds
      latRng <- range(bounds$north,bounds$south)
      lngRng <- range(bounds$east,bounds$west)
      mymap() %>% myfun(InBounds()$df.in) 
    })

    # handler for downloading all plots (but not maps)
    output$plot_down <- downloadHandler(
        filename = 'Plots.docx',content = function(file) {
        src <- normalizePath(c('Plots.Rmd','template_word2.docx')) # SEE HERE
        owd <- setwd(tempdir())
        on.exit(setwd(owd))
        file.copy(src,c('Plots.Rmd','template_word2.docx'),overwrite = TRUE) # SEE HERE
        params <- list(Plot = plot.calc())
        
        Sys.setenv(RSTUDIO_PANDOC="C:/Program Files/RStudio/bin/pandoc")
        out <- rmarkdown::render('Plots.Rmd',output_file = file,params = params,envir = new.env(parent = globalenv()))
        file.rename(out,file)
                        })
    
    # handler showing that I can download a png of the map itself                   
    output$map_down <- downloadHandler(
      filename = 'mymap.png',content = function(file) {
        owd <- setwd(tempdir())
        on.exit(setwd(owd))
        mapshot(mapdown(),file = file,cliprect = "viewport")
                        })}

ui <- fluidPage(
     sidebarPanel(downloadButton('map_down',"Download map"),downloadButton('plot_down',"Download plots")),mainPanel(leafletOutput("map"),plotOutput("plot")))

shinyApp(ui = ui,server = server)

Rmd 文件:

---
title: "Title"
output: 
  word_document:
    reference_docx: template_word2.docx
  
params:
  Plot: NA
---

```{r,echo = FALSE,warning = FALSE,fig.width = 6.4,fig.height = 3.5}
params$Plot
```
  
Plot exports ok

解决方法

由于您没有包含 .docx 模板,我使用 html 文件作为示例。

我的策略是将地图保存为我知道路径的临时文件。然后我可以将路径作为参数传递给 .Rmd 文件,并使用 knitr::include_graphics

包含图像

应用:

# reproducible example of the shiny app,mimicking the functionality and structure of the full app. 
library(shiny)
library(dplyr)
library(leaflet)
library(mapview)
library(ggplot2)

df <- structure(list(Lon = c(-111.584650079555,-112.17670350598,-111.585725614472,-112.173232931394,-111.772792415394),Lat = c(41.7797872701221,43.0098749960118,41.7489995541869,43.0096673539034,42.1053681392244),Size = c(1:5)),row.names = c(NA,-5L),class = c("tbl_df","tbl","data.frame"))

server = function(input,output){
  # baseline map
  mymap <- reactive({
    leaflet(df) %>%
      setView(lng = -111.6,lat = 41.8,zoom = 8) %>%
      addProviderTiles("Esri.WorldImagery",layerId = "basetile",options = providerTileOptions(minZoom = 8,opacity = 0.75)) })
  
  # to be able to use leafletproxy
  output$map <- renderLeaflet({
    mymap() })
  
  # quick plot to show how I'm exporting my actual plots
  plot.calc <- reactive({
    p <- ggplot(df) + geom_point(aes(x = Lon,y = Lat))
    return(p) })  
  
  output$plot <- renderPlot({
    plot.calc() })
  
  # helper function to use with leafleproxy,to allow for export of the user-created map
  myfun <- function(map,df.in,bounds){
    bounds <- InBounds()$bounds
    latRng <- range(bounds$north,bounds$south)
    lngRng <- range(bounds$east,bounds$west)
    
    addCircleMarkers(map,data = df.in,lng = df.in$Lon,lat = df.in$Lat,radius = ~Size * 4,color = "red")  %>%
      fitBounds(min(lngRng),min(latRng),max(lngRng),max(latRng)) 
  }
  
  # pull out data within the zoomed-in boundarier of the map  
  InBounds <- reactive({
    req(input$map_bounds)
    
    bounds <- input$map_bounds
    latRng <- range(bounds$north,bounds$west)
    
    df.in <- df %>%
      filter(Lat >= latRng[1],Lat <= latRng[2],Lon >= lngRng[1],Lon <= lngRng[2])
    output <- list(df.in = df.in,bounds = bounds) 
  }) 
  # update map with the data within the map boundarier                        
  observe({
    leafletProxy("map") %>% myfun(InBounds()$df.in)
  })
  
  # map that will be downloaded
  mapdown <- reactive({
    bounds <- input$map_bounds
    latRng <- range(bounds$north,bounds$west)
    mymap() %>% myfun(InBounds()$df.in) 
  })
  
  # handler for downloading all plots (but not maps)
  output$plot_down <- downloadHandler(
    filename = 'Plots.html',content = function(file) {
      src <- normalizePath(c('Plots.Rmd')) # SEE HERE
      owd <- setwd(tempdir())
      on.exit(setwd(owd))
      file.copy(src,c('Plots.Rmd'),overwrite = TRUE) # SEE HERE
      # save map in tempfile
      map_path <- paste0(tempdir(),"/map.png")
      mapshot(mapdown(),file = map_path,cliprect = "viewport")
      params <- list(Plot = plot.calc(),Map = map_path)
      
      Sys.setenv(RSTUDIO_PANDOC="C:/Program Files/RStudio/bin/pandoc")
      out <- rmarkdown::render('Plots.Rmd',output_file = file,params = params,envir = new.env(parent = globalenv()))
      file.rename(out,file)
    })
  
  # handler showing that I can download a png of the map itself                   
  output$map_down <- downloadHandler(
    filename = 'mymap.png',content = function(file) {
      owd <- setwd(tempdir())
      on.exit(setwd(owd))
      mapshot(mapdown(),file = file,cliprect = "viewport")
    })}

ui <- fluidPage(
  sidebarPanel(downloadButton('map_down',"Download map"),downloadButton('plot_down',"Download plots")),mainPanel(leafletOutput("map"),plotOutput("plot")))

shinyApp(ui = ui,server = server)

Rmd:

---
title: "Untitled"
author: "test"
date: "23 3 2021"
output: html_document
params:
  Plot: NA
  Map: NA
---

```{r,echo = FALSE,warning = FALSE,fig.width = 6.4,fig.height = 3.5}
params$Plot
```

Plot exports ok

```{r,fig.height = 3.5}
knitr::include_graphics(params$Map)
```

Map exports ok
  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res