Я пытаюсь создать один отчет в формате PDF, разбитый на разделы на основе переменной группировки, используя brew
и knitr
. Моя группирующая переменная может содержать специальные символы (умляуты), например å æ ø.
Умляуты только в заголовке документа нормально обрабатываются с помощью \usepackage[utf8]{inputenc}
(см. Примеры ниже). Однако умляуты в группирующей переменной генерируют ошибку с \usepackage[utf8]{inputenc}
.
С другой стороны, когда я попробовал \usepackage[T1]{fontenc}
, умляуты в переменной группировки обрабатывались правильно. Но теперь заголовок закодирован неправильно.
Я изо всех сил пытаюсь получить правильную кодировку как в заголовке, так и в переменной группировки.
Вот пример, в котором я пытаюсь создать один отчет в формате PDF с подразделами сводной статистики по видам в наборе данных ирисов. Я надеюсь, что это может проиллюстрировать мою проблему.
Код R для подготовки данных без умляутов
library(plyr)
library(xtable)
library(knitr)
library(brew)
library(stringr)
Создайте сводную таблицу для каждого вида во встроенном iris
наборе данных. Во-первых, используйте оригинальные Species
имена без умляутов. Умлаут только в документе \title
(см. Код для файла шаблона .rnw
). Храните сводные таблицы в виде списка.
data(iris)
iris_tbl <- dlply(.data = iris, .variables = .(Species), function(x) xtable(summary(x)))
Определите функцию brew_knit_pdf
. Функция преобразует файл латекса шаблона xxx.rnw
в новый .rnw
файл xxx_out.rnw
, в котором есть одна секция для каждого элемента / группы, которая зацикливается. xxx_out.rnw
из brew
затем используется как входной файл в knit2pdf
и преобразуется в PDF.
brew_knit_pdf <- function(template, ...){
brew_out <- str_replace(string = template, pattern = ".rnw", replacement = "_out.rnw")
brew(file = template, output = brew_out)
knit2pdf(input = brew_out, ...)
}
brew_knit_pdf("iris_umlaut_tbl.rnw")
Код для файла шаблона .rnw
В моем примере я назвал файл шаблона следующим кодом iris_umlaut_tbl.rnw
. Этот файл используется в качестве входных данных в функции brew_knit_pdf
в сценарии R.
\documentclass{article}
% \usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{geometry}
\geometry{tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm}
\begin{document}
\begin{titlepage}
\title{Using brew and knitr to produce one PDF report split by a grouping variable.\\Problem with å æ ø in grouping variable}
\clearpage\maketitle
\thispagestyle{empty}
\tableofcontents
\end{titlepage}
\newpage
\section{Summary statistics for each species}
% R code loop wrapped in brew syntax, which brews the template file xxx.rnw to a new .rnw file xxx_out.rnw, which has one section for each group that is looped over, i.e. the names of the list iris_tbl produced in the R script.
<% for (Sp in names(iris_tbl)) { -%>
\subsection{<%= Sp %>}
<<sum-<%= Sp %>, echo=FALSE, results='asis'>>=
print(iris_tbl[["<%= Sp %>"]])
@
\newpage
<% } %>
\end{document}
Код R для подготовки данных с умляутами
Чтобы имитировать мои настоящие данные, я заменяю имена видов в данных радужной оболочки (бессмысленные) имена, которые содержат умляуты.
data(iris)
iris$Species <- as.character(iris$Species)
iris$Species[iris$Species == "setosa"] <- "åsetosa"
iris$Species[iris$Species == "versicolor"] <- "æversicolor"
iris$Species[iris$Species == "virginica"] <- "øvirginica"
# create a summary table for each species
iris_tbl <- dlply(.data = iris, .variables = .(Species), function(x) xtable(summary(x)))
Когда подготовлена «умляутская версия» iris_tbl, я запускаю функцию brew_knit_pdf в том же файле .rnw, что и выше, за исключением того, что я использую разные пакеты кодирования (inputenc и / или fontenc).
Результат
Вот краткое изложение четырех попыток на данный момент; с использованием наборов данных без умляутов или с ними, а также с использованием различных пакетов кодирования в файле .rnw.
- The R data: iris_tbl prepared with non-umlaut Species
- Файл .rnw: умляуты в
\title{ }
,\usepackage[utf8]{inputenc}
Вывод умляутов в заголовке ОК
- The R data: iris_tbl prepared with umlaut version of Species
- Файл .rnw: умляуты в
\title{ }
,\usepackage[utf8]{inputenc}
Вывод
Ошибка: запуск texi2dvi на iris_umlaut_tbl_out.tex не удалось ошибки LaTeX: ... Пакет inputenc Ошибка: Unicode char \ u8: не настроен для использования с LaTeX.
- The R data: iris_tbl prepared with umlaut version of Species
- Файл .rnw:
umlauts in \title{ }
,\usepackage[T1]{fontenc}
,\usepackage[utf8]{inputenc}
Вывод
Ошибка: запуск texi2dvi на iris_umlaut_tbl_out.tex не удалось ошибки LaTeX: ... Пакет inputenc Ошибка: Unicode char \ u8: не настроен для использования с LaTeX.
- The R data: iris_tbl prepared with umlaut version of Species
- Файл .rnw: умляуты в
\title{ }
,\usepackage[T1]{fontenc}
Вывод
умляуты в заголовке не в порядке, умляуты в группирующей переменной - в порядке
Может ли кто-нибудь указать мне правильное направление, чтобы получить правильную кодировку в обоих заголовках и переменных группировки? Заранее большое спасибо за то, что нашли время.
Информация о сеансе
Кодировка текста по умолчанию в моей R Studio 0.97.336: UTF-8
> sessionInfo()
R version 3.0.0 (2013-04-03)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=Norwegian (Bokmål)_Norway.1252 LC_CTYPE=Norwegian (Bokmål)_Norway.1252
[3] LC_MONETARY=Norwegian (Bokmål)_Norway.1252 LC_NUMERIC=C
[5] LC_TIME=Norwegian (Bokmål)_Norway.1252
attached base packages:
[1] splines stats graphics grDevices utils datasets methods base
other attached packages:
[1] Hmisc_3.10-1 survival_2.37-4 pastecs_1.3-13 boot_1.3-9
[5] pspline_1.0-15 ggplot2_0.9.3.1 lubridate_1.2.0 stringr_0.6.2
[9] brew_1.0-6 knitr_1.1 xtable_1.7-1 plyr_1.8
[13] PerformanceAnalytics_1.1.0 xts_0.9-3 zoo_1.7-9 gdata_2.12.0.2
loaded via a namespace (and not attached):
[1] cluster_1.14.4 colorspace_1.2-2 dichromat_2.0-0 digest_0.6.3 evaluate_0.4.3 formatR_0.7
[7] grid_3.0.0 gtable_0.1.2 gtools_2.7.1 labeling_0.1 lattice_0.20-15 MASS_7.3-26
[13] memoise_0.1 munsell_0.4 proto_0.3-10 RColorBrewer_1.0-5 reshape2_1.2.2 scales_0.2.3
[19] tools_3.0.0
> getOption("encoding")
[1] "native.enc"
Обновлять:
Я очень благодарен специалисту по сопровождению пакета brew Джеффри Хорнеру за внеплановый вклад. У него не было проблем с кодированием при запуске моего сценария с Ubuntu и командной строкой R. Это дало мне новую надежду. У меня нет возможности запустить Ubuntu самостоятельно, но сегодня я обновил RStudio (0.97.449) и установил кодировку по умолчанию на ISO8859-1 (спасибо Yihui!). Теперь специальные символы правильно закодированы как в заголовке, так и в группирующей переменной с \usepackage[latin1]{inputenc}
в файле .rnw. Также \usepackage[ansinew]{inputenc}
работает. Я не уверен, что пошло не так в моей первоначальной попытке. Возможно, RStudio не применил кодировку по умолчанию, установленную в параметрах, которую я изменил, следуя совету Yihui, к файлам сценариев, когда я их повторно открыл. Но это всего лишь предположение.