在'knitr'中,如何测试输出是PDF还是word?
我想包括具体内容的基础上,格式正在创建。在这个特定的示例中,我的表在在'knitr'中,如何测试输出是PDF还是word?,r,knitr,R,Knitr,我想包括具体内容的基础上,格式正在创建。在这个特定的示例中,我的表在msword输出中看起来很糟糕,但在HTML中却很好。我想添加一些测试,根据输出省略该表 下面是一些伪代码: output.format <- opts_chunk$get("output") if(output.format != "MS word"){ print(table1) } output.format简短答案 在大多数情况下,选择$get(“rmarkdown.pandoc.to”)提供所需的信息 否则,
msword
输出中看起来很糟糕,但在HTML
中却很好。我想添加一些测试,根据输出省略该表
下面是一些伪代码:
output.format <- opts_chunk$get("output")
if(output.format != "MS word"){
print(table1)
}
output.format简短答案
在大多数情况下,选择$get(“rmarkdown.pandoc.to”)
提供所需的信息
否则,查询rmarkdown::all_output_formats(knitr::current_input())
,并检查返回值是否包含word\u文档
:
if ("word_document" %in% rmarkdown::all_output_formats(knitr::current_input()) {
# Word output
}
长话短说
我假设源文档是RMD,因为这是用于编织不同输出格式(如MS Word、PDF和HTML)的常用/最常见的输入格式
在这种情况下,knitr
选项不能用于确定最终的输出格式,因为从knitr
的角度来看这并不重要:对于所有输出格式,knitr
的工作是将输入RMD文件编织成MD文件。MD文件到YAML头中指定的输出格式的转换在下一阶段通过pandoc
完成
因此,我们不能使用knitr::opts_knit$get(“out.format”)
来了解最终的输出格式,但我们需要解析YAML头
理论上到目前为止。现实有点不同。RStudio的“Knit PDF”/“Knit HTML”按钮调用rmarkdown::render
,然后调用Knit
。在此之前,将rmarkdown.pandoc.to
转换为实际输出格式。该值将分别为html
、latex
或docx
,具体取决于输出格式
因此,如果(且仅当)使用RStudio的“Knit PDF”/“Knit HTML”按钮,则可以使用knitr::opts_Knit$get(“rmarkdown.pandoc.to”)
确定输出格式。这也在和中描述
对于直接调用knit
的情况,问题仍然没有解决,因为没有设置rmarkdown.pandoc.to
。在这种情况下,我们可以利用rmarkdown
包中的(未报告的)函数parse_yaml_front_matter
来解析yaml头
[更新:自r标记
0.9.6起,已添加功能所有输出格式
(感谢您指出这一点)。它使下面开发的自定义函数过时–对于生产,请使用r标记::所有输出格式
!我将此答案的其余部分保留为最初编写的用于教育目的。]
---
output: html_document
---
```{r}
knitr::opts_knit$get("out.format") # Not informative.
knitr::opts_knit$get("rmarkdown.pandoc.to") # Works only if knit() is called via render(), i.e. when using the button in RStudio.
rmarkdown:::parse_yaml_front_matter(
readLines(knitr::current_input())
)$output
```
上面的示例演示了opts\u knit$get(“rmarkdown.pandoc.to”)
(opts\u knit$get(“out.format”)
)的用法(less),而使用parse\u yaml\u front\u matter
的行返回yaml头的“output”字段中指定的格式
parse\u yaml\u front\u matter
的输入是源文件作为字符向量,由readLines
返回。要确定当前正在编织的文件的名称,请使用中建议的current\u input()
在parse_yaml_front_matter
可用于一个简单的if
语句来实现以输出格式为条件的行为之前,需要进行一个小的改进:如果输出有附加的yaml参数,则上面显示的语句可能会返回一个列表,如本例所示:
---
output:
html_document:
keep_md: yes
---
以下帮助函数应解决此问题:
getOutputFormat <- function() {
output <- rmarkdown:::parse_yaml_front_matter(
readLines(knitr::current_input())
)$output
if (is.list(output)){
return(names(output)[1])
} else {
return(output[1])
}
}
请注意,getOutputFormat
仅使用指定的第一种输出格式,因此仅返回带有以下标题的html\u文档
:
---
output:
html_document: default
pdf_document:
keep_tex: yes
---
然而,这并不是很严格。当使用RStudio的“Knit HTML”/“Knit PDF”按钮(以及旁边的下拉菜单以选择输出类型)时,RStudio会重新排列YAML标题,使所选输出格式成为列表中的第一种格式。多个输出格式(AFAIK)仅在使用rmarkdown::render
和output\u format=“all”
时相关。并且:在这两种情况下,都可以使用rmarkdown.pandoc.to
,这更容易 另外一点:上述答案不适用于html\u笔记本
,因为代码直接在那里执行,并且knitr::current\u input()
没有响应。如果您知道文档名称,可以如上所述调用所有输出格式
,明确指定名称。我不知道是否还有其他方法可以做到这一点。只是想在这里补充一点说明,因为我经常将同一个Rmarkdown文件(*.Rmd)呈现为多种格式(*.html,*.pdf,*.docx),而不是想知道感兴趣的格式是否列在前面的yaml(即“word\u文档”)中指定的格式中%r在%r标记::所有输出格式(knitr::当前输入()
)中,我想知道当前呈现的是哪种格式。要执行此操作,您可以:
获取前面列出的格式的第一个元素:rmarkdown::all_output_formats(knitr::current_input()[1]
;或
获取默认输出格式名称:rmarkdown::默认输出格式(knitr::current\u input())$name
例如
---
title: "check format"
output:
html_document: default
pdf_document: default
word_document: default
---
```{r}
rmarkdown::all_output_formats(knitr::current_input())[1]
```
```{r}
rmarkdown::default_output_format(knitr::current_input())$name
```
```{r}
fmt <- rmarkdown::default_output_format(knitr::current_input())$name
if (fmt == "pdf_document"){
#...
}
if (fmt == "word_document"){
#...
}
```
---
标题:“检查格式”
输出:
html_文档:默认值
pdf_文档:默认值
word\u文档:默认值
---
```{r}
rmarkdown::所有_输出_格式(knitr::current_input())[1]
```
```{r}
rmarkdown::默认输出格式(knitr::当前输入())$name
```
```{r}
fmt由于knitr
1.18,您可以使用这两个功能
knitr::is_html_output()
及
你的源文件是什么?RMarkdown?以及你生成最终文件的函数?为什么不自己创建一个新变量来描述输出格式和条件?是的,RMarkdown是我的源文件。我也在使用Rstudio。I c
knitr::is_html_output()
knitr::is_latex_output()