Как установить ширину выходного лотка 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.