Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在'knitr'中,如何测试输出是PDF还是word?_R_Knitr - Fatal编程技术网

在'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()