Как установить ширину выходного лотка knitr на каждый кусок?
Мой вопрос (ы):
Имеет ли параметр knitr параметр, позволяющий установить R width
для каждого блока?
Если нет, есть ли веская причина (т.е. некоторая фундаментальная ограниченность модели knitr), которой она не является?
Что я пробовал:
Чтобы показать то, что я желаю, вот ручная функция hook, которая делает в основном то, что я хочу. (Мне это действительно не нравится, (а) потому, что он уродлив, полагаясь на присвоение переменной .width
в глобальной среде, и (б), поскольку он недоступен "из коробки" в качестве поставляемой опции например, fig.width
, out.width
и др.)
\documentclass[preview=true,width=3mm]{standalone}
\begin{document}
<<setup, include=FALSE, cache=FALSE>>=
options(width=60)
knit_hooks$set(width = function(before, options, envir) {
if(before) {
.width <<- options(width=options$width) ## Set width and save 'old' value
} else {
options(.width)} ## Restore width 'old' value
})
@
First chunk uses default width
<<A>>=
c("aaaaa", "bbbbb", "ccccc", "ddddd", "eeeee", "fffff", "ggggg", "hhhhh")
@
Second chunk uses narrower supplied width, but then resets width to
pre-existing value \dots
<<B, width=20>>=
c("aaaaa", "bbbbb", "ccccc", "ddddd", "eeeee", "fffff", "ggggg", "hhhhh")
@
\noindent \dots as shown by results of the third chunk
<<C>>=
c("aaaaa", "bbbbb", "ccccc", "ddddd", "eeeee", "fffff", "ggggg", "hhhhh")
@
\end{document}
![enter image description here]()
Ответы
Ответ 1
Хотя это не решение общего вопроса, ваша первая жалоба на ваш код заключается в том, что он сжимает глобальную среду с помощью переменной .width
. Это можно решить, используя local()
как механизм закрытия, инкапсулируя вашу переменную, чтобы вы не получили столкновений в глобальном пространстве var.
Итак, если вы замените свой вызов knit_hooks$set
на:
knit_hooks$set(width=local({
.width <- 0
function(before, options, envir) {
if (before) .width <<- options(width=options$width)
else options(.width)
}
}))
он дает те же результаты без проблемы принудительного .width
в глобальной среде. Остальная часть вашего кода выше работает по-прежнему с идентичным выходом.
Больше можно прочитать в help(local)
, в Advanced R Programming (Hadley Wickham), и есть несколько примеров этого в дикой природе, таких как @JeroenOoms 'OpenCPU.
Ответ 2
Это также отвечает на мой вопрос. Я использую Beamer и knitr
для создания накладных расходов, а иногда я делаю вывод меньшим (например, чтобы получить анализ таблицы дисперсии в одной части без упаковки). Например, у меня ширина по умолчанию 50, но теперь я могу сделать
{\small
<<width=55>>=
summary(my.aov)
@
}
и я получаю значения Р в тех же строках, что и суммы квадратов, но ширина для 50-х последующих кадров равна 50.