我的问题与已经得到回答的问题非常相似,但有一个关键的区别.有几百个,它们看起来都运行得很好.也就是说,当存在编织的RMD脚本时(例如,通过单击RStudio中的"编织"按钮),这些解决方案显示如何获取代码以检测非交互式编织过程正在进行.不幸的是,当用户以交互方式运行相同的脚本时(例如,通过在RStudio中 Select Run All命令Ctrl+Alt+R),它们都不起作用.与在特殊的非交互R会话中执行编织过程的Knit不同,Run All在用户当前所在的同一交互会话中执行RMD命令.我的问题是如何检测这种交互式RMD环境.
我这样做的原因是,我想调用一个调用全局R处理程序的函数,具体地说是progressr::handlers(global = TRUE)
.全局处理程序函数不能在RMD上下文中运行(可能是因为它们被封装在tryCatch
块中,这不允许全局处理程序).所以,我想编写我的代码,让它知道它是从和RMD块运行的,然后在这种情况下不运行.
我以前没有意识到这一点,但显然,R上下文(或者至少是我使用的RStudio)确实知道何时从控制台而不是从RMD块交互运行代码.以下是触发此问题的错误:
然而,同一行代码在控制台上运行良好,没有错误(没有输出,但没有错误-它在后台工作):
以下是try all the solutions proposed for detecting non-interactive execution次的最小可重现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()
的调用堆栈.但值得注意的是,107 returns 108个.
相比之下,以下是当我interactively单击Run All时的输出:
正如您所看到的,当为100 is 101时,非交互执行的解决方案都不起作用:它们要么返回FALSE
,要么返回NULL
.因此,我无法断定这些代码行是从RMD块中执行的(如您所见,它们都是从RMD块中执行的).
所以,can anyone help me figure out how to tell if code is running INTERACTIVELY within an R Markdown (Rmd) context?