В документе я рисую несколько сюжетов внутри одного фрагмента. Я бы хотел, чтобы высота каждого графика была пропорциональна количеству категорий на вертикальной оси. Основываясь на this SO answer, я пытаюсь сделать это с помощью knit_expand
, чтобы создать новый кусок для каждого сюжета с программными параметрами куска.knitr: Ошибка дублирования метки куска при использовании knit_expand для изменения размеров графика программно внутри фрагмента
Образец документ с воспроизводимыми данными и кодом вклеен ниже. Функция kexpand
- это то, что создает новый кусок для каждого сюжета. Я запускаю функцию в цикле for в последнем фрагменте. Цикл for создает три графика, по одному для каждого уровня dept
в образцах данных. Однако, когда я (попытка) связать документ, я получаю следующее сообщение об ошибке:
Line 23 Error in parse_block(g[-1], g[1], params.src) : duplicate label 'English' Calls: ... process_file -> split_file -> lapply -> FUN -> parse_block Execution halted
Это первый раз, когда я пытался динамически изменять параметры порций, и я не уверен, как метка чанка получая дублирование, так как каждый уровень dept
переходит в knit_expand
только один раз. Я попробовал предложение в this SO question использовать knit_child
вместо knit
внутри функции kexpand
, но я получил ту же ошибку.
Итак, мои вопросы: (1) как я могу избежать дублирования ошибки метки и получить документ вязать правильно, и (2) я собираюсь по этому правильному пути или есть лучший способ динамического изменения chunk options при создании графиков или таблиц в цикле?
---
title: "Untitled"
author: "eipi10"
date: "February 12, 2017"
output: pdf_document
---
```{r setup, include=FALSE}
knitr::opts_knit$set(progress = FALSE, verbose = FALSE)
knitr::opts_chunk$set(echo = FALSE, message=FALSE, warning=FALSE)
library(tidyverse)
library(scales)
library(knitr)
```
```{r}
# Adapted from https://stackoverflow.com/a/27234462/496488
kexpand <- function(ht, cap, plot) {
cat(
knit(
text=knit_expand(
text=sprintf("```{r %s, fig.height=%s, fig.cap='%s'}\n%s\n```", cap, ht, cap, plot)
)))
}
```
```{r data}
df = structure(list(dept = c("English", "English", "English", "English",
"English", "English", "English", "English", "English", "English",
"English", "English", "English", "English", "English", "Biology",
"Biology", "Biology", "Biology", "Biology", "Biology", "Government",
"Government"), tot_enrl = c(114, 349, 325, 393, 415, 401, 166,
117, 302, 267, 256, 224, 481, 295, 122, 410, 478, 116, 278, 279,
238, 142, 145), course = c("ENGL 1", "ENGL 10M", "ENGL 11M",
"ENGL 16", "ENGL 1X", "ENGL 20M", "ENGL 3", "ENGL 30A", "ENGL 40A",
"ENGL 40B", "ENGL 50A", "ENGL 50B", "ENGL 5M", "ENGL 60", "ENGL 65",
"BIO 15L", "BIO 2", "BIO 30", "BIO 39", "BIO 7", "BIO 9", "GOVT 10",
"GOVT 1H")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-23L), .Names = c("dept", "tot_enrl", "course"))
```
```{r results="asis"}
height.unit = 0.2
for (d in unique(df$dept)) {
.pl = ggplot(df[df$dept==d, ], aes(tot_enrl, reorder(course,tot_enrl))) + geom_point()
ht = height.unit * length(unique(df$course[df$dept==d])) + 1
kexpand(ht=ht, cap=d, plot=.pl)
}
```