缓存
每次Knit 都会执行整个R markdown文件中的代码。如果可以缓存某些运行时间较长代码的结果,在只更改了下游代码的前提下可以节省整体运行的时间。
cache=TRUE
可以缓存当前代码块运行的结果,每次运行时,如果当前代码块中的代码没有改变,则会使用缓存的结果。
dependson=此代码块依赖的其他代码块的向量
,如果依赖的代码块中的代码发生改变,dependson
选项的存在可以使依赖的代码块也重新运行。
如果markdown文档中的代码没有改变,读取的输入文件本身发生了变化,可以用cache.extra=file.info("输入文件")
捕捉输入文件是否发生了变化,从而决定是否需要重新运行代码。file.info()
函数范围一系列文件的信息,包括文件最后一次被编辑的时间。
全局选项
默认的全局变量设置可能不能满足要求,因此可以用knitr::opts_chunk$set()
设置全局变量,例如:
# echo=FALSE默认在最终文档中不显示所有的代码
# 可以在需要展示的代码块处单独设置echo=TRUE
knitr::opts_chunk$set(
echo=FALSE, collapse=TRUE
)
Inline code
可以在文档文本中直接嵌入R 代码,如下:
My weight is `r format(50.1234,digits=1)`.
# Knite后的效果是:My weight is 50.1.
27.4.7练习题
1. 增加一个章节,描述钻石大小如何随着cut、color和clarity变化,假设你要给不需要看你代码的人汇报,设置全局变量达到目的。
2. 增加一个章节描述最大的20个钻石,包括一个描述它们最重要特性的表格。
3. 用comma <- function(x) format(x, digits = 2, big.mark = ",")
函数得到漂亮的格式化输出,包含大于2.5克拉的钻石的百分比。
4. 建立一个d
依赖b
和c
,b
和c
又都依赖a
的网络代码,每个代码中打印lubridate::now()
,设置cache=TRUE
验证你对缓存的理解。
答案,首先是1、2、3题:
---
title: "Diamond sizes"
date: 2016-08-25
output: html_document
---
```{r setup, include = FALSE}
library(ggplot2)
library(dplyr)
smaller <- diamonds |>
filter(carat <= 2.5)
\```
We have data about `r nrow(diamonds)` diamonds. Only
`r nrow(diamonds) - nrow(smaller)` are larger than
2.5 carats. The distribution of the remainder is shown
below:
```{r, echo = FALSE}
smaller |>
ggplot(aes(carat)) +
geom_freqpoly(binwidth = 0.01)
\```
# 钻石大小如何随着cut、color和clarity变化。
```{r, echo=FALSE}
knitr::opts_chunk$set(echo=FALSE)
\```
```{r}
library('ggpubr')
carat_vs_cut <- ggplot(diamonds,aes(color=cut,x=carat)) + geom_freqpoly(binwidth=0.1)
carat_vs_color <- ggplot(diamonds,aes(color=color,x=carat)) + geom_freqpoly(binwidth=0.1)
carat_vs_clarity <- ggplot(diamonds,aes(color=clarity,x=carat)) + geom_freqpoly(binwidth=0.1)
ggarrange(carat_vs_clarity,carat_vs_color,carat_vs_cut,nrow=3,ncol=1)
\```
# 描述最大的20个钻石的特性
```{r}
sort_by_carat <- diamonds %>% arrange(desc(carat))
knitr::kable(sort_by_carat[1:20,])
\```
# 大于2.5克拉的钻石的百分比
```{r}
comma <- function(x) format(x, digits = 2, big.mark = ",")
bigger <- diamonds %>% filter(carat>2.5)
\```
The percentage of diamands whose weight is more than 2.5 carat is `r comma(nrow(bigger)/nrow(diamonds))`
第4题:
---
title: "Untitled1"
output: html_document
---
```{r a}
lubridate::now()
\```
```{r b, cache=TRUE, dependson="a"}
lubridate::now()
\```
```{r c, cache=TRUE, dependson="a"}
lubridate::now()
\```
```{r d, cache=TRUE, dependson=c("b","c")}
lubridate::now()
\```
网友评论