如何更改 knitr 选项中间块

Posted

技术标签:

【中文标题】如何更改 knitr 选项中间块【英文标题】:How to change knitr options mid chunk 【发布时间】:2012-07-25 00:23:38 【问题描述】:

您好,我想更改块选项,中间块,而不必创建新块..

运行以下代码,我希望得到两个大小非常不同的输出,但由于某种原因,情况似乎并非如此。

另外,第二个绘图根本不绘图...(当您将其更改为 plot(2:1000) 时它会绘图...但无论哪种方式,第二个输出的大小都与第一个相同。@987654324 @. 我做错了什么?

请注意“中间块”的重要性,原因是我想在运行函数时多次更改块选项以获得不同大小的不同输出。

```r
sessionInfo()

opts_chunk$set(fig.width=3)

plot(1:1000)

opts_chunk$set(fig.width=10)

plot(1:1000)

```

sessionInfo 输出如下:

## R version 2.15.1 (2012-06-22)
## Platform: i386-pc-mingw32/i386 (32-bit)
## 
## locale:
## [1] LC_COLLATE=English_United Kingdom.1252 
## [2] LC_CTYPE=English_United Kingdom.1252   
## [3] LC_MONETARY=English_United Kingdom.1252
## [4] LC_NUMERIC=C                           
## [5] LC_TIME=English_United Kingdom.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices datasets  utils     methods   base     
## 
## other attached packages:
## [1] knitr_0.7
## 
## loaded via a namespace (and not attached):
## [1] digest_0.5.2   evaluate_0.4.2 formatR_0.5    parser_0.0-16 
## [5] plyr_1.7.1     Rcpp_0.9.13    stringr_0.6    tools_2.15.1  

【问题讨论】:

理论上我可以允许你使用fig.width=c(3, 10)并将这两个图分别保存在3英寸和10英寸,但问题是当我记录这些图时,我每个块只能使用一个尺寸,因此,如果记录大小和绘图大小不同,您的绘图可能看起来不正确(有关详细信息,请参阅graphics manual) ***.com/q/11653573/559676 应该是一个很好的例子,向您展示如何以可编程方式构建代码块并编织它们;它可能比那种情况更复杂,但无论如何你都可以做到 【参考方案1】:

这对我有用,基于 github 上 Yui 的提示。

\documentclassarticle

\begindocument
<<setup,echo=FALSE>>=
opts_knit$set(progress = F, verbose = F)
opts_chunk$set(comment=NA, warning=FALSE,message=FALSE,fig.width=6, echo=F)
kexpand=function()
  cat(knit(
  text=knit_expand(text=
                     "<<yfig-cap-,fig.cap='cap',results='markup',echo=FALSE,fig.height=figheight,out.height=outheight>>=\n
                   .q\n
                   @"
  )
))
@

<<results='asis'>>=
library(ggplot2)
.q=qplot(1:10);cap="first caption";figheight=9;outheight=90
kexpand()
.q=qplot(1:20);cap="second caption";figheight=12;outheight=160
kexpand()

@
\enddocument

所以一个关键的事情是将进度和详细设置为 F 否则它们会破坏输出。然后小函数 kexpand 扩展了一个内联模板,该模板作为函数的一部分输入为文本。 然后,您可以将绘图定义为 .q,将标题定义为 cap,以及您的身高等。您可以调整该功能以控制其他选项。 奇怪的是,.q 和标题不一定是函数的参数,你可以在当前环境中设置它们,无论如何它们都会被函数拾取。不知道这是否是好的做法,或者为什么它有效,但确实有效。

【讨论】:

出于某种原因,这仅适用于我完全按照您的示例进行操作。如果我有 ggplot 以外的图,(base R,metafor 森林图)它不起作用。更奇怪的是,如果我在向量中有高度并通过向量循环创建图形,它也不起作用。您是否知道您的方法是否可以更改以适用于我的情况? ***.com/questions/37998364【参考方案2】:

两个问题:当你想保留两个数字时,使用

```r fig.keep='all'

默认只保留唯一的地块(因为你的两个地块是相同的,第二个被删除;有关详细信息,请参阅knitr graphics manual)。

下一个区块打开时,全局区块选项处于活动状态:

```r
opts_chunk$set(fig.width=10)
```


```r
opts_chunk$set(fig.width=2)
# Our figure is 10 wide, not 2
plot(1:1000)
```

```r
# Our figure is 2 wide, not 10
opts_chunk$set(fig.width=10)
plot(1:1000)
```

【讨论】:

同意fig.keep='all' 部分。谢谢你,我很感激......但问题的主要部分的重点不是将代码分解成单独的块......正如我所提到的,我正在运行一个生成不同大小输出图像的函数要创建并将整个块的fig.width 设置为对某些图像没问题,这会使其他图像太小或太大,因此我想编辑代码以在函数的图之间放置opts_current$set(fig.width=x) @h.l.m 简短的回答是否定的,不可能以这种方式使用opts_current @Yihui 缺乏在块中更改块选项的能力......这可能会改变还是会继续存在?是否可以要求它作为未来的增强功能......? @h.l.m 我最多可以支持fig.width=a_numeric_vector,但这不是一个理想的解决方案;它为您提供正确的输出大小,但不是原始记录大小;数字可能看起来很难看。如果这是可以接受的,那么 github 问题就可以了

以上是关于如何更改 knitr 选项中间块的主要内容,如果未能解决你的问题,请参考以下文章

如何动态设置 OpenIdConnect 中间件选项的权限?

更改 jQuery UI 滑块值选项时动画滑块句柄?

将pdf写入图形文件夹,但删除png

如何在R中使用knitr创建一个包含代码块和文本的循环

带有 knitr 幻灯片的长功能垂直滚动条

如何以编程方式更改初始标签栏选择