如何判断代码是否在 R Markdown (Rmd) 上下文中交互运行?

问题描述 投票:0回答:1

我的问题与已回答的问题非常相似,但有一个关键的区别。有几种解决方案可以检测代码是否在 R Markdown (Rmd) 上下文中以非交互方式运行,而且它们似乎都工作得很好。也就是说,当有一个正在编织的 Rmd 脚本时(例如,通过单击 RStudio 中的“编织”按钮),这些解决方案展示了如何获取代码来检测非交互式编织过程正在进行中。不幸的是,当用户以交互方式运行相同的脚本时(例如,通过选择“全部运行”命令,在 RStudio 中按 Ctrl+Alt+R),它们都不起作用。与 Knit 不同,Knit 在特殊的非交互式 R 会话中执行编织过程,Run All 在用户当前所在的同一交互式会话中执行 Rmd 命令。我的问题是如何检测交互式 Rmd 上下文。

我这样做的原因是我想调用一个调用全局 R 处理程序的函数,特别是

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) 上下文中交互式运行?

r r-markdown rstudio knitr interactive
1个回答
0
投票
您可以使用:

identical(getOption("rstudio.notebook.executing"), TRUE)
RStudio 在块执行期间管理此选项,并在 R Markdown 块内交互执行时将其设置为 

TRUE

© www.soinside.com 2019 - 2024. All rights reserved.