如何在每个块的基础上设置knitr块输出宽度?

时间:2014-04-28 19:24:13

标签: r knitr

我的问题:

knitr 是否有一个选项允许在每个块的基础上设置R的width选项?

如果没有,是否有一个很好的理由(即根据 knitr 模型的一些基本限制),它没有?

我尝试了什么:

为了显示我想要的东西,这里有一个手动挂钩功能,可以基本上我想要的东西。 (我真的不喜欢它,(a)因为它很难看,依赖于将变量.width分配到全局环境中,以及(b)因为它不是“开箱即用”的提供的选项如fig.widthout.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's '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

2 个答案:

答案 0 :(得分:6)

虽然不是整体问题的解决方案,但您对代码的第一次抱怨是,它使用您的.width变量来哄骗全球环境。这可以使用local()作为闭包机制解决,封装您的变量,以便在全局变量空间中不会发生冲突。

因此,如果您将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&#39; OpenCPU

答案 1 :(得分:0)

这也回答了我的问题。我正在使用Beamer和knitr来进行开销,有时我会将输出设置得更小(例如,在没有包装的情况下对一个方差分析表进行分析)。例如,我的默认宽度为50,但我现在可以

{\small 
<<width=55>>=
  summary(my.aov)
@
}

我得到相同行的P值和平方和,但后续块的宽度仍然是50。