progressr::handlers(global = TRUE)
。全局处理程序函数无法在 Rmd 上下文中运行(可能是因为它们被封装在
tryCatch
块中,该块不允许全局处理程序)。因此,我想编写我的代码,使其知道它是从 Rmd 块运行的,然后在这种情况下不会运行。我之前没有意识到这一点,但显然,R 上下文(或者至少是我使用的 RStudio)确实知道代码何时从控制台交互运行,而不是从 Rmd 块交互运行。这是触发此问题的错误:
然而,同一行代码运行良好,控制台没有错误(没有输出,但没有错误 - 它在后台工作):
这是一个最小的可重现 Rmd 文件,它尝试
---
title: "Test Rmd self-awareness"
output: html_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r}
interactive()
```
```{r}
isTRUE(getOption('knitr.in.progress'))
```
```{r}
knitr::opts_knit$get("out.format")
```
```{r}
sys.calls()
```
当我编织该文档时,以下是我得到的摘录:非交互式执行工作的解决方案:
isTRUE(getOption('knitr.in.progress'))
返回
TRUE
,
knitr::opts_knit$get("out.format")
给出有意义的输出(
"markdown"
),
sys.calls()
返回带有
rmarkdown::render()
和
knitr::knit()
的调用堆栈。但是,值得注意的是,
interactive()
返回
FALSE
。
相反,以下是我交互地单击全部运行时的输出:
如您所见,当interactive()
为
TRUE
时,所有非交互式执行解决方案都不起作用:它们返回 FALSE
或
NULL
。因此,我无法判断这些代码行是从 Rmd 块内执行的(如您所见,它们都是)。那么,
谁能帮我弄清楚如何判断代码是否在 R Markdown (Rmd) 上下文中交互式运行?
identical(getOption("rstudio.notebook.executing"), TRUE)
RStudio 在块执行期间管理此选项,并在 R Markdown 块内交互执行时将其设置为 TRUE
。