如何在knitr中获得块名?

时间:2014-11-18 11:30:06

标签: r knitr r-markdown

我想根据块名列表设置块选项“eval”。是否有一个函数来获取knitr中的块名称,例如chunk_name?

这是伪函数名称“chunk_name”的最小示例。

---
output: html_document
---

```{r setup}
eval_chunks <- c('chunk1')
```

```{r chunk1, eval=chunk_name() %in% eval_chunks}
plot(cars)
```


```{r chunk2, eval=chunk_name() %in% eval_chunks}
plot(cars)
```

感谢您的任何建议。如果我的问题不明确,请告诉我。

2 个答案:

答案 0 :(得分:11)

自2012年以来,Knitr在一个块内提供了标签(需要更多Google,https://github.com/yihui/knitr/issues/73)。

这是我的示例Rmd文件:

---
output: html_document
---

```{r setup}
library(knitr)
eval_chunks <- c('chunk1', 'chunk3')
```

```{r chunk1, eval=opts_current$get("label") %in% eval_chunks}
print(opts_current$get("label"))
```


```{r chunk2, eval=opts_current$get("label") %in% eval_chunks}
print(opts_current$get("label"))
```


```{r chunk3, eval=opts_current$get("label") %in% eval_chunks}
print(opts_current$get("label"))
```

答案 1 :(得分:1)

我认为这个解决方案并不完美,因为它需要在确保评估正确的块时要小心,但它解决了在调用钩子之前评估块选项的问题。简而言之,它不使用钩子,而是使用块选项可以是R表达式的事实。在这种情况下,使用函数e(),它依赖于全局计数器变量来指示是否应该评估特定的块。因为按顺序评估块,所以这是有效的。在下面的示例中,chunk1chunk3会被评估,但其他的则不会。

---
output: html_document
---

```{r setup}
library("knitr")
.i <- 2 # `setup` is the first chunk, so start at 2
.x <- all_labels() %in% c("chunk1", "chunk3")
e <- function(){
    d <- .x[.i]
    .i <<- .i + 1
    d
}
```

```{r chunk1, eval=e()}
x <- 1
x
```

```{r chunk2, eval=e()}
x <- 2
x
```

```{r chunk3, eval=e()}
x <- 3
x
```

```{r chunk4, eval=e()}
x <- 4
x
```