knitr 是否有一个选项允许在每个块的基础上设置R的width
选项?
如果没有,是否有一个很好的理由(即根据 knitr 模型的一些基本限制),它没有?
为了显示我想要的东西,这里有一个手动挂钩功能,可以基本上我想要的东西。 (我真的不喜欢它,(a)因为它很难看,依赖于将变量.width
分配到全局环境中,以及(b)因为它不是“开箱即用”的提供的选项如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'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}
答案 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。