Создайте заголовки RMarkdown и фрагменты кода в purrr

#r #r-markdown

Вопрос:

Ниже приведено .Rmd то, что, по моему мнению, должно привести к тому, что я ищу:

 ---
title: "Untitled"
date: "10/9/2021"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

full_var <- function(var) {
  cat("### `", var, "` {-} n")
  cat("```{r}", "n")
  cat("print('test')", "n")
  cat("```", "n")
}

vars <- c("1", "2", "3")
```

```{r results = "asis"}
purrr::walk(vars, full_var)
```
 

Вместо этого это выглядит так:

пример

Почему это print('test') не оценивается, а вместо этого представляется в виде блока кода?

Комментарии:

1. Какой результат вы ищете?

2. Ты хочешь print('test') вместо cat("print('test')", "n") этого ?

Ответ №1:

Решение

Если вы визуализируете свой код, а также результаты выполнения кода в виде result='asis' фрагмента, я думаю, вы сможете управлять тем, что вам нужно. Вы можете сделать это, воспользовавшись knitr knit() следующей функцией:

 ---
title: "Untitled"
date: "10/9/2021"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

full_var <- function(var) {
  
  # Define the code to be run
  my_code <- "print('test')"
  
  # Print the code itself, surrounded by chunk formatting
  cat("### `", var, "` {-} n")
  cat("```{r}", "n")
  cat(my_code, "n")
  cat("``` n")
  
  # Use knitr to render the results of running the code.
  # NB, the use of Sys.time() here is to create unique chunk headers,
  # which is required by knitr. You may want to reconsider this approach.
  cat(knitr::knit(
    text = sprintf("```{r %s}n%sn```n",  Sys.time(), my_code), 
    quiet = TRUE
  ))
}

vars <- c("1", "2", "3")
```

```{r results = "asis"}
purrr::walk(vars, full_var)
```
 

Это приводит к следующему результату:
Вывод кода

Подробности: Как knitr работает

При knitr визуализации файла R Markdown он выполняет это на следующих этапах:

  1. knitr создает обычный файл уценки на основе вашего оригинала .Rmd . Это происходит, когда используются такие вещи, как заголовок yaml и параметры фрагмента, и это очень важно, когда запускается ваш код R
  2. pandoc преобразует файл уценки в конечный результат. Именно то, что здесь происходит, зависит от того, какой формат вывода вы используете.

Как работает knitr

С помощью results='asis'

Опция «Фрагмент results = 'asis' » просто изменяет то, как будет выглядеть промежуточный сценарий уценки в процессе рендеринга. Например,

 ```{r}
cat("print('# Header')")
```
 

будет отображаться в markdown следующим образом: (обратите внимание, что отступ здесь означает, что это код в соответствии с синтаксисом markdown):

     ## # print('# Header')
 

В то время как, если results = 'asis' используется, вы получите уценку

 print('# Header')
 

Важно понимать, что, хотя "print('# Header')" R-код является допустимым, он появляется только на этапе 2 процесса, то есть после выполнения всего R — кода.

Сообщение «Забрать домой»

К сожалению, вы не можете ожидать results='asis' вывода кода R, а затем его запуска, так как knitr к этому моменту вы уже закончили выполнение кода R.

Ответ №2:

Еще один способ достичь своей цели :

 ---
  title: "Untitled"
date: "10/9/2021"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

full_var <- function(var) {
  cat("### `", var, "` {-} n")
  cat("```{r}", "n")
  cat(eval(parse(text = "print('test')")), "n")
  cat("```", "n")
}

vars <- c("1", "2", "3")
```

```{r results = "asis"}
purrr::walk(vars, full_var)
```