我想根据正在创建的格式包含特定内容.在这个具体的例子中,我的表在MS word输出中看起来很糟糕,但很棒HTML.我想添加一些测试,根据输出省略表.
这是一些伪代码:
output.format <- opts_chunk$get("output")
if(output.format != "MS word"){
print(table1)
}
Run Code Online (Sandbox Code Playgroud)
我确信这不是正确的使用方法opts_chunk,但这是我对如何knitr在幕后工作的理解的限制.测试这个的正确方法是什么?
CL.*_*CL. 42
在大多数情况下,opts_knit$get("rmarkdown.pandoc.to")提供所需的信息.
否则,查询rmarkdown::all_output_formats(knitr::current_input())并检查返回值是否包含word_document:
if ("word_document" %in% rmarkdown::all_output_formats(knitr::current_input()) {
# Word output
}
Run Code Online (Sandbox Code Playgroud)
我假设源文档是RMD,因为这是针对不同输出格式(如MS Word,PDF和HTML)编织的常用/最常见的输入格式.
在这种情况下,knitr选项不能用于确定最终输出格式,因为从以下角度来看无关紧要knitr:对于所有输出格式,knitr我们的工作是将输入RMD文件编织为MD文件.将MD文件转换为YAML标头中指定的输出格式将在下一阶段完成pandoc.
因此,我们不能使用package选项 knitr::opts_knit$get("out.format")来了解最终的输出格式,但我们需要解析YAML头.
理论上到目前为止.现实有点不同.RStudio的"Knit PDF"/"Knit HTML"按钮调用rmarkdown::render依次调用knit.在这之前,render设置一个(无证?)封装选项 rmarkdown.pandoc.to的实际输出格式.的值将是html,latex或者docx分别根据输出格式.
因此,如果(并且仅当)使用RStudio的"Knit PDF"/"Knit HTML"按钮,knitr::opts_knit$get("rmarkdown.pandoc.to")则可以用于确定输出格式.这个答案和博客文章也对此进行了描述.
knit直接调用的问题仍然没有解决,因为rmarkdown.pandoc.to没有设置.在这种情况下,我们可以利用该(未导出)函数parse_yaml_front_matter从rmarkdown包解析YAML报头.
[ 更新:从rmarkdown0.9.6开始,该功能all_output_formats已被添加(感谢Bill Denney指出这一点).它使得下面开发的自定义功能已经过时 - 用于生产,使用rmarkdown::all_output_formats!我留下这个答案的其余部分原来是出于教育目的而写的.]
---
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
```
Run Code Online (Sandbox Code Playgroud)
上面的例子说明了的使用(lesness) (opts_knit$get("rmarkdown.pandoc.to")),opts_knit$get("out.format")而线用人parse_yaml_front_matter返回在YAML报头的"输出"字段中指定的格式.
输入parse_yaml_front_matter是源文件作为字符向量,由返回readLines.要确定当前正在编织的文件的名称,请使用此答案中的current_input()建议.
之前parse_yaml_front_matter可以在一个简单的if语句中使用以实现以输出格式为条件的行为,需要进行小的改进:如果输出有其他YAML参数,则上面显示的语句可能返回一个列表,如下例所示:
---
output:
html_document:
keep_md: yes
---
Run Code Online (Sandbox Code Playgroud)
以下辅助函数应解决此问题:
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])
}
}
Run Code Online (Sandbox Code Playgroud)
它可以用于诸如的结构中
if(getOutputFormat() == 'html_document') {
# do something
}
Run Code Online (Sandbox Code Playgroud)
请注意,getOutputFormat仅使用指定的第一个输出格式,因此仅html_document返回以下标头:
---
output:
html_document: default
pdf_document:
keep_tex: yes
---
Run Code Online (Sandbox Code Playgroud)
但是,这不是很严格.当使用RStudio的"Knit HTML"/"Knit PDF"按钮(以及旁边的下拉菜单以选择输出类型)时,RStudio重新排列YAML标头,使得所选输出格式将成为列表中的第一种格式.多种输出格式使用时是(据我所知)唯一相关的rmarkdown::render有output_format = "all".并且:在这两种情况下rmarkdown.pandoc.to都可以使用,这样更容易.
Dav*_*vid 13
从knitr1.18开始,您可以使用这两个函数
knitr::is_html_output()
Run Code Online (Sandbox Code Playgroud)
和
knitr::is_latex_output()
Run Code Online (Sandbox Code Playgroud)
小智 7
只是想在这里添加一点澄清,因为我经常将相同的 Rmarkdown 文件 (*.Rmd) 呈现为多种格式 (*.html、*.pdf、*.docx),所以与其想知道兴趣列在前面内容 yaml(即"word_document" %in% rmarkdown::all_output_formats(knitr::current_input())中指定的那些中,我想知道当前正在呈现哪种格式。为此,您可以:
获取前面列出的格式的第一个元素:rmarkdown::all_output_formats(knitr::current_input()[1]; 或者
获取默认输出格式名称: rmarkdown::default_output_format(knitr::current_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"){
#...
}
```
Run Code Online (Sandbox Code Playgroud)