在预编译小插图中添加传单

Adding a leaflet in a precompile vignette

我在我的公司维护 R 代码,供多个同事使用。我决定将我的代码转换成一个包,以使其更易于共享、维护和记录。我的包被构建为保留在内部,在封闭的环境中使用并且不会在 CRAN 上。我正在使用 Rstudio,它运行得比较好,但是我在构建小插图时遇到了问题。

问题是我的代码对非常大的数据集进行了非常具体、冗长和复杂的分析。因此,我不可能在每次重建包时都构建小插图。使用 devtools::install_git(build_vignettes = TRUE) 时更不用说让用户这样做了。我在这个不错的博客 (https://ropensci.org/blog/2019/12/08/precompute-vignettes/) 中找到了这个问题的解决方案。简而言之,您在 vignettes 名称 .Rmd 之后添加 .orig,这样它们就不会被构建过程识别为 vignette。然后,当你准备好时,你通过编织你的 .Rmd.orig 文件来预编译你的脚本:

knitr::knit("vignettes/longexample.Rmd.orig", output = "vignettes/longexample.Rmd")

这将为您的包创建一个快速简单的可编译版本的插图。这适用于带有文本和图形的基本文档。但是,我需要在小插图中输入传单地图。如果我使用此过程创建带有传单的小插图,我会收到错误消息:

## PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.
## PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.
## Error in path.expand(path): invalid 'path' argument

我认为这是一条消息,显示 knitr 正在尝试获取我的地图的屏幕截图以将其另存为图像。这不是我想要的,我想要一张实际的地图。

可重现的例子

我写的小插曲:

---
title: "Example"
author: "BastienFR"
date: "09/05/2022"
output: html_document
---

```{r setup, message=F, warning=FALSE}
library(leaflet)
```

## Intro

A simple and slow example of vignette with a `leaflet`

## The slow part

```{r}
time <- 2
Sys.sleep(time)
message("I've waited this long!")
```

## The leaflet

```{r}
m <- leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")
```

```{r}
m
```

然后,我用 :

编译它
knitr::knit("c://temp//longexample.Rmd.orig", output = "c://temp//longexample.Rmd")

产生此输出:

---
title: "Example"
author: "BastienFR"
date: "09/05/2022"
output: html_document
---


```r
library(leaflet)
```

## Intro

A simple and slow example of vignette with a `leaflet`

## The slow part


```r
time <- 2
Sys.sleep(time)
message("I've waited this long!")
```

```
## I've waited this long!
```

## The leaflet


```r
m <- leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")
```

```{r}
m
```


```
## PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.
## PhantomJS not found. You can install it with webshot::install_phantomjs(). If it is installed, please make sure the phantomjs executable can be found via the PATH variable.
```

```
## Error in path.expand(path): invalid 'path' argument
```

因此,它无法将传单传递到新的 knit markdown 文件中(这是有道理的)。

我试图通过将传单保存到这样的临时文件中来绕过这个问题(在我的 .orig 文件中):

```{r, include=FALSE}
saveRDS(m, "c://temp/temp_leaflet.rds")
```

这会保存我的地图,但我必须找到一种方法在编译版本中添加下一个代码块,所以它出现了,而且它只在那里 运行。 knitr 按原样传递下面的代码块的一些方法。

```{r, include=FALSE}
m <- readRDS("c://temp/temp_leaflet.rds")
```

所以我卡住了。知道如何在预编译后将传单显示到 markdown/vignette 中吗?

这个问题可以通过让 knitr knit “asis”你想在第二个中编织的代码行来解决 运行,所以在构建小插图时......为此,你可以改变部分:

```{r}
m
```

作者:

```{r, echo=FALSE}
saveRDS(m, "c://temp/temp_leaflet.rds")
```

```{r, eval=T, results="asis", echo=FALSE}
cat("```{r, echo=FALSE, warning=FALSE} \n")
cat("library(leaflet) \n")
cat("m <- readRDS('c://temp/temp_leaflet.rds') \n")
cat("```")
```

```{r, eval=T, results="asis", echo=FALSE}
cat("```{r, echo=TRUE} \n")
cat("m \n")
cat("```")
```

说明

首先,您将地图(或数据)保存在 rds 文件中的某个位置。然后,您使用 results="asis" 代码块选项和 cat 函数编写您只需要在第二次编译(构建小插图时)中呈现的代码块。所以你实际上是在将 Rmarkdown 代码包装到 Rmarkdown 中......这很丑陋且令人困惑,但它确实有效。使用这种方法,编织 Rmd.orig 文件后的渲染代码看起来像普通的 Rmarkdown 代码:

```{r, echo=FALSE, warning=FALSE} 
library(leaflet) 
m <- readRDS('c://temp/temp_leaflet.rds') 
```

```{r, echo=TRUE} 
m 
```

然后它将完美呈现在您的小插图中。

现在唯一复杂的是管理 rds 文件的保存和读取位置,因为 markdown 和 vignettes 可能有棘手的工作目录。

所以最终的 .orig 文件现在是:

---
title: "Example"
author: "BastienFR"
date: "09/05/2022"
output: html_document
---

```{r setup, message=F, warning=FALSE}
library(leaflet)
```

## Intro

A simple and slow example of vignette with a `leaflet`

## The slow part

```{r}
time <- 2
Sys.sleep(time)
message("I've waited this long!")
```

## The leaflet

```{r}
m <- leaflet() %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(lng=174.768, lat=-36.852, popup="The birthplace of R")
```

```{r, echo=FALSE}
saveRDS(m, "c://temp/temp_leaflet.rds")
```

```{r, eval=T, results="asis", echo=FALSE}
cat("```{r, echo=FALSE, warning=FALSE} \n")
cat("library(leaflet) \n")
cat("m <- readRDS('c://temp/temp_leaflet.rds') \n")
cat("```")
```

```{r, eval=T, results="asis", echo=FALSE}
cat("```{r, echo=TRUE} \n")
cat("m \n")
cat("```")
```