Я использую R Markdown для массового создания параметризованных отчетов в формате PDF. У меня нет проблем с запуском каждого фрагмента кода и без проблем с созданием одного PDF-файла. Но когда я запускаю функцию lapply() внизу, три (переменная «cut» в наборе данных по бриллиантам имеет пять категорий) PDF-файлов генерируются успешно, но я застрял на четвертом, «Очень хорошо». Вместо этого я получаю сообщения об ошибках:
ЧТО Я ПРОБОВАЛ:
Я переустановил R, RStudio, tinytex и все пакеты, используемые в моем коде. Я определил, что проблема как-то связана с фрагментом кода ggplot — следовательно, все пять PDF-файлов будут успешно сгенерированы, если я исключим этот фрагмент кода.
ОБНОВЛЯТЬ:
КОД:
Ниже приведено все, что есть в моем текущем файле «testing_for_stackoverflow.Rmd», что приводит к сообщению об ошибке спецификации шрифта:
---
output:
pdf_document:
latex_engine: xelatex
tables: true
graphics: yes
header-includes:
- \usepackage{booktabs}
- \usepackage{fontspec}
- \usepackage{graphicx}
- \usepackage{amsmath}
- \setmainfont{Times New Roman}
- \newcommand{\bcenter}{\begin{center}}
- \newcommand{\ecenter}{\end{center}}
params:
cut: "Very Good"
---
\fontsize{10}{12}
\selectfont
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE,
warning = FALSE,
message = FALSE,
fig.align = 'center',
include = TRUE,
tinytex.tlmgr_update = FALSE,
results='asis',
fig.dim = c(7, 2.5))
pacman::p_load(tidyverse)
```
## I'm using "diamonds" dataset and cut is my parameter
```{r}
filter(diamonds, cut == params$cut) %>%
ggplot(aes(color, price)) +
geom_boxplot()
```
```{r}
kableExtra::kable(head(filter(diamonds, cut == params$cut)))
```
Запустите этот код в консоли, чтобы создать несколько выходных файлов:
library(tidyverse)
lapply(unique(diamonds$cut), function(i) {
rmarkdown::render(input = "testing_for_stackoverflow.Rmd",
params = list(cut = i),
rmarkdown::pdf_document(),
output_dir = "out/",
output_file = paste0(i, ".pdf"))
})
@stefan Спасибо за советы! Я отредактировал свое сообщение, но часть YAML выглядит странно, когда я вставляю ее как текст. Надеюсь, это все еще имеет смысл, если я сохраню скриншот..
Вы звоните rmarkdown::render
из документа? Это странно. Но в опубликованном вами коде указано, что это параметр speed
, а в вашем документе есть параметр с именем cut
.
@user2554330 Спасибо за внимание! Нет, не запускайте окончательный код lapply() в этом файле Rmd. Вырежьте и вставьте его в консоль для запуска. И извините за опечатку — вырезается параметр, а не скорость (скорость — это еще один тестовый документ, в котором я использую набор данных автомобилей).
Я отредактировал ваш вопрос, чтобы сделать его немного понятнее. Я не получаю ту ошибку, которую вы получили, когда запускаю ее; У меня несколько другое, жалуются на шрифты. Когда я удаляю пакет fontspec
и спецификацию шрифта, ошибок не возникает. Но я на Mac; ваша ошибка выглядит как проблема с путями Windows.
@user2554330 user2554330 Спасибо, что отредактировали мой вопрос! И сейчас у меня та же проблема со спецификацией шрифта — это определенно новая проблема, потому что к тому времени, когда я опубликовал свой вопрос, у меня ее НЕ было. И сообщение об ошибке в спецификации шрифта не имеет смысла, поскольку я определил latex_engine: xelatex в своем YAML. Есть идеи по решению этой проблемы? xelatex важен, потому что в моем отчете мне приходится использовать Time New Roman.
Я заметил проблему сейчас. При вызове rmarkdown::render()
вы указываете output_format
как rmarkdown::pdf_document()
. Это переопределяет раздел output:
в YAML. Если вы хотите указать что-то, как в примере кода, используйте rmarkdown::pdf_document(latex_engine = "xelatex")
.
Четвертый обработанный (или, скорее, необработанный) документ содержит пробел в предполагаемых промежуточных и конечных именах файлов: Very Good...
. Судя по сообщению об ошибке, имя файла может быть ошибочно интерпретировано как две отдельные инструкции (undefined control sequence
).
Замена заглушки решит проблему? Один подход:
lapply(make.names(unique(diamonds$cut)), ...)
вместо:
lapply(unique(diamonds$cut), ...)
Оцените решение — оно определенно решает проблему, вызванную моим недосмотром проблемы с пробелами в именах файлов, и да, использование make.names() действительно предотвращает появление предыдущего сообщения об ошибке: «! Неопределенная управляющая последовательность». Теперь я могу получить все пять выходных файлов в формате PDF. ОДНАКО для файла «Очень хорошо» и график, и таблица имеют определенные параметры, оси для графика и имена столбцов для таблицы, но не содержат содержимого. Пожалуйста, не тратьте слишком много времени на решение этой проблемы. Я буду использовать переменную токена вместо параметра Cut.
Более насущная проблема сейчас (см. мой разговор с @user2554330) Я получаю новое сообщение об ошибке, в котором говорится, что «fontspec требует xelatex или laulatex», но я уже определил «latex_engine: xelatex» в своем YAML. В своем отчете мне приходится использовать шрифт Times New Roman, поэтому для меня важна спецификация шрифта. Есть идеи по этому вопросу? Заранее спасибо!
На форуме TeX может вам повезет, см. е. г. это ответ. В случае с RStudio вы также можете попробовать установить «Инструменты» > «Параметры» > «Глобальные параметры» > «Sweave» > «Набор текста» ... используя значение «XeLaTeX».
Добро пожаловать в ТАК! К сожалению, мы не можем запускать код или визуализировать Rmd из изображений . Вместо этого просто скопируйте и вставьте свой код Rmd в виде текста в свой вопрос. Подробнее о том, как задать хороший вопрос, см. в разделе Как создать отличный воспроизводимый пример R.