программно создавать заголовки и оценивать следующие фрагменты кода в уценке - PullRequest
0 голосов
/ 20 сентября 2018

Мой вопрос похож на ТАК вопрос , но вместо создания графика я хочу оценить фрагмент кода.Я хотел знать, возможно ли программно генерировать заголовки и для оценки фрагментов кода, следуя их соответствующим заголовкам?Моя попытка сделать это ниже.

У меня есть 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 голосов
/ 20 сентября 2018

Вот один из способов решения проблемы, подобной этой.Мне дали подсказку на SO, но я не могу найти ответ ...

Два документа: один родитель, один ребенок.Думайте о дочернем документе как о подпрограмме, которую можно вызывать любое количество раз, и его выходные данные сохраняются (и объединяются в вектор 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
0 голосов
/ 20 сентября 2018

Это происходит потому, что 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(), так как это может привести к такому поведению.Подробнее здесь - Назначение и удаление объектов в цикле: eval (parse (paste (

* 1017) * Этот ответ будет работать для вашего примера, но, пожалуйста, примите во внимание то, что я упомянул, и обсуждение в 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
```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...