Подтвердить что ты не робот

Условно отобразить блок текста в R Markdown

Я использую knitr для анализа документа R Markdown. Есть ли способ условно отобразить блок текста в R Markdown в зависимости от переменной в среде, которую я передаю в knitr?

Например, что-то вроде:

`r if(show.text) {`
  la la la
`r }`

Будет напечатан "la la la" в результирующем документе, если show.text - true.

4b9b3361

Ответ 1

Вам нужно полное выражение R, поэтому вы не можете разбить его на несколько блоков, как вы показываете, но если результаты блока являются текстовой строкой, то они будут включены как есть (без кавычек), поэтому вы должны быть способны сделать что-то вроде:

`r if(show.text){"la la la"}`

и он будет включать текст тогда и только тогда, когда show.text есть TRUE.

Ответ 2

Вы можете сделать это, используя опцию "eval" chunk. Смотрите http://yihui.name/knitr/options/.

'''{r setup, echo=FALSE}
show_text <- FALSE
''''

'''{r conditional_block, eval=show_text}
print("this will only print when show.text is TRUE")
'''

Я использовал файлы конфигурации YAML для параметризации своих отчетов об уценке, что делает их более пригодными для повторного использования.

'''{r load_config}
library(yaml)
config <- yaml.load_file("config.yaml")
'''

...

'''{r conditional_print, eval=config$show_text}
print("la la la")
''''

Ответ 3

Мне легче всего это сделать, поместив весь текст в отдельный файл, а затем включите его из основного файла с помощью

```{r conditional_print, child='text.Rmd', eval = show_text}
```

Это имеет то преимущество, что вы можете поместить в дочерний файл встроенные операторы R или другие фрагменты, так что, если вы передумаете о том, что считается дополнительным текстом, вам не нужно реорганизовывать ваш проект.

Ответ 4

Здесь настраивается подход Пола Бордмана, который дает правильную разметку на выходе.

```{r setup, echo=FALSE}
show_text <- FALSE
```

```{r conditional_block, echo=FALSE, results='asis', eval=show_text}
cat("## Hey look, a heading!

lorem ipsum dolor emet...")
```

Еще лучше, если мы вызываем движок python для генерации нашего вывода, мы можем использовать тройное цитирование, чтобы легко обрабатывать текст, содержащий одиночные или двойные кавычки, без необходимости делать что-то фантастическое:

```{python, conditional_block_py, echo=FALSE, results='asis', eval=show_cond_text}
print("""
## Still a heading

Block of text with 'single quotes' and "double quotes"
""")
```

Ответ 5

Вышеупомянутые решения могут быть немного неуклюжими для больших блоков текста и не очень хороши для определенных ситуаций. Скажем, я хочу создать рабочий лист для студентов с некоторыми вопросами, а также использовать тот же файл .Rmd для создания файла с решениями. Я использовал базовое управление потоком LaTeX:

``` {r, include = F}
# this can be e.g., in a parent .Rmd and the below can be in child
solution <- TRUE 
```
\newif\ifsol
\sol`r ifelse(solution, 'true', 'false')`

Тогда я могу сделать:

What is $2 + 2$

\ifsol
4
\fi

Таким образом вы также можете создавать альтернативные блоки текста, используя

\ifsol
Alternative 1
\else
Alternative 2
\fi

Ответ 6

Я попытался определить функцию my.render(), которая предварительно обрабатывает файл Rmd и, в зависимости от аргумента commentout, либо сохраняет код комментариев HTML (TRUE) в файле Rmd, либо удаляет их (FALSE). Затем записывает предварительно обработанный Rmd файл в tmp.Rmd и использует обычную функцию render().

my.render <- function(input, commentout=FALSE, ...) {
  if (commentout == FALSE) {
    ## Delete the HTML comment lines from code
    txt <- readLines(input)
    txt[grepl(" *<!-- *| *--> *", txt)] <- ""
    write.table(txt, file="tmp.Rmd", sep="\n", quote=FALSE, row.names=FALSE, col.names=FALSE)
    render("tmp.Rmd", output_file=sub("Rmd","html",input), ...)
  } else {
    render(input, output_file=sub("Rmd","html",input), ...)
  }
}

Казалось, работает. Э.Г.

<!--
This text with formulas $\alpha+\beta$ is visible, when commentout=FALSE.
-->

Ответ 7

Другой способ условного добавления текста уценки приведен ниже. Он использует "движок" block, который, кажется, работает нормально, хотя я не уверен, как заставить работать встроенную оценку R.

Обратите внимание, что я использую переключатель view_all, определенный в метаданных YAML, чтобы контролировать, является ли блок видимым.

Также обратите внимание на то, что необходимы опции чанков eval и include. Первый предотвращает ошибки во время обычного Run All в RStudio. Второй предотвращает вывод с помощью Knit.

---
title: "Conditional Output"
params:
  view_all: false
output:
  html_document: default
  pdf_document: default
---

'''{block eval=FALSE, include=params$view_all}
# Some simple markdown.

Some things work: $2 + 2^2 = 3\cdot2$

Other does not: 2 + 2 = 'r 2+2'
'''