Как вложить вызовы вязания, чтобы исправить повторяющиеся ошибки метки фрагмента?

Я сталкиваюсь с ошибкой повторяющейся метки, когда вызываю функцию, которая использует knit внутри вызова knit. Если я помечу куски, проблема исчезнет. Есть ли способ вызвать some_function таким образом, чтобы он не конфликтовал с родительским вызовом knit?

library(knitr)
some_function <- function(){
    knit(text ="
    ```{r }
        1
    ```
    ")
}
cat(knit(text ="
```{r }
    some_function()   
```
```{r }
    some_function()   
```
"))

Выход:

```r
some_function()
```

```
## Error: duplicate label 'unnamed-chunk-1'
```

person nachocab    schedule 08.07.2013    source источник
comment
почему бы не назвать просто чанк с какой-то_функцией?   -  person agstudy    schedule 09.07.2013
comment
Мне нужно было убедиться, что метка фрагмента уникальна каждый раз, когда я вызываю some_function.   -  person nachocab    schedule 09.07.2013


Ответы (2)


Вы можете использовать knit_child() вместо knit() в some_function():

library(knitr)
some_function <- function(){
  knit_child(text ="
    ```{r }
        1
    ```
    ")
}
cat(knit(text ="
```{r }
    some_function()   
```
```{r }
    some_function()   
```
"))
person Yihui Xie    schedule 12.07.2013
comment
Большое спасибо @Yihui! Если я правильно понял код knit, установка дочернего режима гарантирует, что ни один объект не будет записан в .knitEnv, что меня и смутило. Верный? - person nachocab; 12.07.2013
comment
knit() инициализирует некоторые внутренние объекты, в том числе объект для управления фрагментами кода, а knit_child() — нет; если этот объект снова инициализируется, Knitr снова начнет считать фрагменты с 1, что приведет к фрагментам с одной и той же меткой unnamed-chunk-1 в двух вложенных вызовах knit(), и они будут конфликтовать. - person Yihui Xie; 12.07.2013

Я не совсем понимаю контекст использования вашего кода. Почему бы не использовать просто функцию дочернего документа для трикотажа?

Вот обходной путь (надеюсь, что кто-то другой предложит лучшее решение, особенно вы, если вы дадите больше контекста)

some_function <- function(chunk.name='chunk1'){
  knit(text =sprintf("
    ```{r %s}
        1
    ```
    ",chunk.name))
}
cat(knit(text ="
```{r }
    some_function('a1')   
```
```{r }
    some_function('a2')   
```
"))
person agstudy    schedule 08.07.2013