在预编译小插图中添加传单
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("```")
```
我在我的公司维护 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("```")
```