Действие ifelse в зависимости от типа документа в rmarkdown

При подготовке отчетов с использованием rmarkdown: http://rmarkdown.rstudio.com/ Можно пожелать, чтобы документ отображался по-разному в зависимости от типа документа. Например, я могу захотеть встроить видео на YouTube, если отображаемый документ представляет собой HTML-файл, где, как если бы это был PDF или MS Word, я хотел бы вместо этого гиперссылку URL.

Есть ли способ сказать rmarkdown что-то вроде этого:

if (html) {
    <iframe width="640" height="390" src="https://www.youtube.com/embed/FnblmZdTbYs?    feature=player_detailpage" frameborder="0" allowfullscreen></iframe>
} else {
    https://www.youtube.com/watch?v=ekBJgsfKnlw
}

код

devtools::install_github("rstudio/rmarkdown")
library(rmarkdown)
render("foo.Rmd", "all")

foo.Rmd

---
title: "For Fun"
date: "`r format(Sys.time(), '%d %B, %Y')`"
output:
  html_document:
    toc: true
    theme: journal
    number_sections: true
  pdf_document:
    toc: true
    number_sections: true
  word_document:
    fig_width: 5
    fig_height: 5
    fig_caption: true
---

## Good times

<iframe width="640" height="390" src="https://www.youtube.com/embed/FnblmZdTbYs?feature=player_detailpage" frameborder="0" allowfullscreen></iframe>

3 ответа

Решение

Да, вы можете получить доступ к выходному формату через knitr::opts_knit$get("rmarkdown.pandoc.to"), Это вернет строку с целевым форматом вывода. Вот пример:

---
title: "Untitled"
output: html_document
---

```{r}
library(knitr)
opts_knit$get("rmarkdown.pandoc.to")
```

Это возвращает "html" для html_document, "docx" для word_document и "latex" для pdf_document. Поэтому, чтобы ответить на ваш вопрос, вы можете сделать что-то вроде:

html <- knitr::opts_knit$get("rmarkdown.pandoc.to") == "html"

Как указано в ответе на связанный вопрос, knitr 1.18 введены следующие функции

knitr::is_html_output()
knitr::is_latex_output()

Как следует из названия, is_html_output() проверяет, является ли вывод HTML. Вы бы добавили что-то подобное foo.Rmd:

```{r results='asis'}
if (knitr::is_html_output()) {
    cat('<iframe width="640" height="390" src="https://www.youtube.com/embed/FnblmZdTbYs?        feature=player_detailpage" frameborder="0" allowfullscreen></iframe>')
} else {
    cat("https://www.youtube.com/watch?v=ekBJgsfKnlw")
}
```

Другой способ, используя параметры фрагмента кода.

Получите тип выходного файла в начале документа.

      ```{r, echo=FALSE}
out_type <- knitr::opts_knit$get("rmarkdown.pandoc.to")
```

Затем, evalкусок кода в зависимости от типа файла:

      ```{r, results='asis', eval=(out_type=="html"), echo=FALSE}
cat('<iframe width="640" height="390"
        src="https://www.youtube.com/embed/FnblmZdTbYs?feature=player_detailpage"
        frameborder="0" allowfullscreen>
     </iframe>')
```

```{r, results='asis', eval=(out_type!="html"), echo=FALSE}
cat('https://www.youtube.com/embed/FnblmZdTbYs?feature=player_detailpage')
```
Другие вопросы по тегам