Loops in Rmarkdown: How to make an in-text figure reference? Figure captions?

老子叫甜甜 提交于 2019-12-05 21:34:33

SOLUTIONS

  1. Use knit_expand()
  2. Use captioner instead of kfigr
  3. This numbers your figures (or tables) in text and at the end of your report.
  4. This script shows you how to create markdown paragraphs in for loops that have in-text references to figures.
  5. It also shows you how to create custom figure captions in for loops while retaining the number order.
  6. If you show how to do #4 and #5 using brew I will give you all the SO points.

Libraries

library(knitr) library(dplyr) library(png) library(grid) library(pander) library(ggplot2) library(devtools) library(captioner)

Create a fig_nums() function using the captioner package (https://github.com/adletaw/captioner/blob/master/vignettes/using_captioner.Rmd)

fig_nums <- captioner(prefix = "Figure")

Data

Each year we have a different number of strata, hence the need for a loop.

df <- rbind(
  data.frame(strata = rep("A", 10), x = rnorm(10, mean= 10), y = rnorm(10, mean = 15), z = rnorm(10, mean = 20)),
  data.frame(strata = rep("B", 10), x = rnorm(10, mean= 5), y = rnorm(10, mean = 10), z = rnorm(10, mean = 15)),
  data.frame(strata = rep("C", 10), x = rnorm(10, mean= 15), y = rnorm(10, mean = 20), z = rnorm(10, mean = 10)))

first_plot: the figure that should appear in the list before for loop creates the sections by strata

first_plot <- ggplot(df, aes(x, fill=strata)) + geom_histogram()
fig_nums("first_plot", display = FALSE)

last_plot: the figure that should appear in the list after the for loop creates the sections by strata

last_plot <- ggplot(df, aes(x = strata, y = z)) + geom_boxplot()

Figure generation

Comment this section out once you have figs how you want. This step will not feel convoluted, unnatural, suboptimal, unnecessary, or like a very bad idea if you do a lot of mapping in R.

strat <- unique(df$strata)

  for (i in seq_along(strat)) {
   sub <- df %>% filter(strata %in% strat[i])
   fig1 <- ggplot(sub, aes(x = x, y = y)) + geom_point()
   ggsave(fig1, file=paste0("fig1_", strat[i], ".png"))
   fig2 <- ggplot(sub, aes(x = x, y = z)) + geom_point() 
   ggsave(fig2, file=paste0("fig2_", strat[i], ".png"))
 }        

Load the png's

df_figs <- list.files(pattern = "\\.png$")
for (i in df_figs){  
   name <- gsub("-",".",i)
   name <- gsub(".png","",name)  
   i <- paste(".\\",i,sep="")
   assign(name,readPNG(i))
}

Introduction

Some introductory text in the report and a figure r fig_nums("first_plot", display="cite").

Results and image file names that will be referenced in text:

```{r echo = FALSE, warnings=FALSE, message=FALSE, results = "asis"}

    results <- df %>% 
      group_by(strata) %>% 
      dplyr::summarise_each(funs(mean)) %>% 
      mutate(fig1 = paste0("fig1_", strata),
             fig2 = paste0("fig2_", strata))

```

```{r run-numeric-md, warning=FALSE, include=FALSE}

#The text for the markdown sections in for loop... the knit_expand() is the work-horse here.

out = NULL
for (i in as.character(unique(results$strata))) {
  out = c(out, knit_expand(text=c('#### The *{{i}}* strata',
                                  '\n',
                                  'The mean of *x* is ',
                                  '{{paste(sprintf("%1.1f", results$x[results$strata==i]))}}', '({{fig_nums(results$fig1[results$strata==i],display="cite")}}).',
                                  '\n'
  )))
}

```

Creates section for each strata

`r paste(knit(text = out), collapse = '\n')`

Conclusion

Some discussion text in the report and figure r fig_nums("last_plot",display="cite").

List of Figures

`r fig_nums("first_plot",caption="Here is the caption for the first figure.")`

```{r 'first_plot', echo=FALSE, warning=FALSE, fig.width=6.5, fig.height=6}
suppressMessages(print(first_plot))
```

```{r figcaps, include=FALSE}
caps = NULL

for (i in as.character(unique(results$strata))) {
  caps = c(caps, knit_expand(  
    text=c({{fig_nums(results$fig1[results$strata==i], caption="Caption text for strata *{{i}}* goes here.")}},
           '``` {r {{results$fig1[results$strata==i]}}, echo=FALSE, warning=FALSE, fig.width=6.5, fig.height=6}',
           {{paste0('grid.raster(',results$fig1[results$strata==i],')')}},
                                    '```',
           '\n')))
}

#DON'T FORGET TO UNLIST!
src <- unlist(caps)
```

`r paste(knit(text = src),sep='\n')`

`r fig_nums("last_plot", caption="The caption for the last figure.")`

```{r 'last_plot', echo=FALSE, warning=FALSE, fig.width=6.5, fig.height=6}
suppressMessages(print(last_plot))
```
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!