【问题标题】:How to get chunk name in knitr?如何在knitr中获取块名称?
【发布时间】:2014-11-18 11:30:06
【问题描述】:

我想根据块名称列表设置块选项“eval”。是否有在 knitr 中获取块名称的功能,例如块名?

这是我使用假函数名称“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)
```

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

【问题讨论】:

  • 假设块名称不变,您可以创建一个命名逻辑向量eval_chunk &lt;- c(chunk1 = TRUE, chunk2 = FALSE),然后说{r chunk1, eval = eval_chunk["chunk1"]}
  • 也可以尝试使用钩子。
  • @RomanLuštrik 我有同样的想法,但问题noted in a comment here,是在调用钩子之前评估块选项,所以这实际上不起作用。

标签: r knitr r-markdown


【解决方案1】:

自 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"))
```

【讨论】:

  • 我试图理解为什么需要这些块名称。不都是默认执行的吗?
  • 它们可以在渲染 Rmd 时用作文字进度条。
  • @EduardoReis 块标签也用作Rnw 编译为乳胶的文档中的图形和表格的标签引用。这些对于编写可重现的报告或出版物很有用。
【解决方案2】:

我认为这个解决方案是不完美的,因为它需要注意确保评估正确的块,但它解决了在调用钩子之前评估块选项的问题。简而言之,它不使用钩子,而是使用块选项可以是 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
```

【讨论】:

  • “因为块是按顺序计算的”。是这样吗? (参见dependson
  • @baptiste 我不想在复杂的文档中尝试这个。
  • @Thomas 感谢您的建议。我同意您关于复杂文档(在我的情况下)的观点,尤其是在添加/删除块时。
  • 哪些考虑让您在代码中使用 .i 而不是 i?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
相关资源
最近更新 更多