#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 он выполняет это на следующих этапах:
knitr
создает обычный файл уценки на основе вашего оригинала.Rmd
. Это происходит, когда используются такие вещи, как заголовок yaml и параметры фрагмента, и это очень важно, когда запускается ваш код R- pandoc преобразует файл уценки в конечный результат. Именно то, что здесь происходит, зависит от того, какой формат вывода вы используете.
С помощью 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)
```