我的问题类似于此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')
}
```
任何见识将不胜感激!
答案 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_list
和i
。
# `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