以编程方式创建标头并评估markdown中的以下代码块

时间:2018-09-19 22:05:27

标签: r r-markdown

我的问题类似于此SO question,但我不想创建绘图,而是要评估代码块。我想知道是否有可能以编程方式生成标头在它们各自的标头之后评估代码块吗?我对此的尝试如下。

我有一个list数据帧,我想创建一个标头并评估每个list元素的代码块。下面的示例仅用于使用nrow()计算每个数据帧的行数。

```{r data}
data("iris","airquality","mtcars")
my_list <- list(iris,airquality,mtcars)
names(my_list) <- c("iris","airquality","mtcars")
```

```{r headers, results = 'asis'}
for (i in seq_along(my_list)) {
  cat('#', names(my_list)[i], '\n')
  cat('```{r}', '\n')

  cat('nrow(mylist[[i]])') #evaluate any other code here

  cat('\n')
  cat('```')
  cat('\n')
}
```

任何见识将不胜感激!

2 个答案:

答案 0 :(得分:0)

此行为是因为R在由所有mylist调用创建的新环境中找不到您的cat对象。同样,由于mylist[[i]]是一个表达式,我们将不得不对其进行解析和评估以获得最终结果。

例如-

```{r headers, results = 'asis'}
for (i in seq_along(my_list)) {
  cat('#', names(my_list)[i], '\n')
  cat('```{r}', '\n')
  cat(eval(parse(text = 'i')))

  cat('\n')
  cat('```')
  cat('\n')
}
```

上面的代码将给出如下结果(这是我们需要的结果)-

# iris 
```{r} 
1
```
# airquality 
```{r} 
2
```
# mtcars 
```{r} 
3
```

但是要使用mylist进行此操作,我们需要以某种方式确保mylist对象在新环境中,然后才能对其进行评估。另外请注意,人们不鼓励使用parse(),因为它可能导致此类行为。更多内容-Assigning and removing objects in a loop: eval(parse(paste(

此答案适用于您的示例,但请考虑我在SO问题中提到的内容和讨论-

```{r data}
data("iris","airquality","mtcars")
my_list <- list(iris,airquality,mtcars)
names(my_list) <- c("iris","airquality","mtcars")
```

```{r headers, results = 'asis'}
for (i in seq_along(my_list)) {
  cat('#', names(my_list)[i], '\n')
  cat('```{r}', '\n')

  # somehow get the data or any other objects in here
  # this works for trivial examples please be carefule before using it on actual code chunks
  cat(eval(parse(text = paste(nrow(my_list[[i]])))))


  cat('\n')
  cat('```')
  cat('\n')
}
```

# iris 
```{r} 
150
```
# airquality 
```{r} 
153
```
# mtcars 
```{r} 
32
```

答案 1 :(得分:0)

这是我解决类似问题的一种方式。我在这里得到了提示,但找不到答案...

两个文件:一位父母,一位孩子。可以将子文档视为可以多次调用的子例程,并保存其输出(并与character向量out串联)。在该循环中完成操作后,将使用内联`r code`块。

主文档,我猜是“父母”:

---
output: md_document
---

```{r data}
data("iris","airquality","mtcars")
my_list <- list(iris,airquality,mtcars)
names(my_list) <- c("iris","airquality","mtcars")
```

```{r headers, echo = FALSE, include = FALSE, results = 'asis'}
out <- NULL
for (i in seq_along(my_list)) {
  out <- c(out, knitr::knit_child("somedoc-child.Rmd"))
}
```

`r paste(out, collapse="\n")`

由父文档调用的子文档,与上面的目录somedoc-child.Rmd相同。它完全像父母离开时一样看到环境,因此可以完美地看到my_listi

# `r names(my_list[i])`

```{r, results="asis"}
nrow(my_list[[i]])
```

当我编织降价时,我得到:

    data("iris","airquality","mtcars")
    my_list <- list(iris,airquality,mtcars)
    names(my_list) <- c("iris","airquality","mtcars")

iris
====

    nrow(my_list[[i]])

\[1\] 150

airquality
==========

    nrow(my_list[[i]])

\[1\] 153

mtcars
======

    nrow(my_list[[i]])

\[1\] 32