如何判断代码是否在 knitr/rmarkdown 上下文中执行?

how to tell if code is executed within a knitr/rmarkdown context?

根据一些简单的测试,当 运行ning 代码在 rmarkdown::render()knitr::knit2html() 中时,interactive() 为真。也就是说,一个简单的 .rmd 文件包含

```{r}
print(interactive())
```

给出一个 HTML 文件报告 TRUE

有谁知道我可以在代码块中 运行 进行测试,以确定它是否 运行 "non-interactively",我的意思是 "within knit2html() or render()"?

我怀疑 (?) 您可能只需要自己动手。

如果是这样,这里有一种方法似乎效果很好。它的工作原理是提取调用堆栈中所有函数的名称,然后检查它们中的任何一个是否命名为 "knit2html""render"。 (取决于你需要它有多健壮,你可以做一些额外的检查以确保这些确实是 knitrrmarkdown 包,但总体思路还是一样的。)

```{r, echo=FALSE}
isNonInteractive <- function() {
    ff <- sapply(sys.calls(), function(f) as.character(f[[1]]))
    any(ff %in% c("knit2html", "render"))
}
```

```{r}
print(isNonInteractive())
```

关于自己滚动的简单建议:看看您是否可以访问当前输出格式:

```{r, echo = FALSE}
is_inside_knitr = function() {
        !is.null(knitr::opts_knit$get("out.format"))
}
```

```{r}
is_inside_knitr()
```

当然,您可以检查很多事情 -- 这不是这些功能的预期用途,因此它可能不是最可靠的解决方案。

因为 Yihui suggested on github isTRUE(getOption('knitr.in.progress')) 可用于检测代码是否正在编织或交互执行。