在单个命令中运行选定的 Rmd 块

plc*_*yhd 6 r rstudio r-markdown rnotebook rstudioapi

我正在尝试 Rmd 笔记本,我被困在一些看起来应该可行的事情上,但我根本找不到解决方案。

基本上,我想要一种功能性的方法来运行选定的 Rmd 块,而无需使用 knit 进行编译。所以我认为使用依赖块、缓存等在这里不起作用。

这是一个示例笔记本:

示例_笔记本.Rmd

---
title: "Example_Notebook"
output: html_notebook
---

```{r Chunk_1 , include=T}
print(1+2)
Var1 <- 'Variable From Chunk 1'
```

```{r Chunk_2 , include=T}
Var2 <- 'Variable From Chunk 2'
```

```{r Chunk_3 , include=T}
print(Var1)
Var3 <- 'Variable From Chunk 3'
print(Var3)
```
Run Code Online (Sandbox Code Playgroud)

假设我想运行 Chunk 1 和 Chunk 3。要手动执行此操作,我可以在光标位于 Chunk_1 时使用 Ctrl+Shift+Enter,然后在光标位于 Chunk_3 时再次使用 Ctrl+Shift+Enter。这将跳过 Chunk_2,同时仍然获得 1 和 3 的输出。

我正在寻找一种方法来在单个命令/函数中执行此操作。这与 RStudio 中的“运行上面的所有块”按钮类似,但显然我想跳过 Chunk_2。

我尝试了很多方法将其写在函数中。我得到的最接近的是使用 rstudioapi 包。这是我的函数的样子:

MyNewFunction <- function(){
    rstudioapi::navigateToFile( file = 'Example_Notebook.Rmd' , line = 6  )
    Sys.sleep(.2)
    rstudioapi::executeCommand(commandId = 'executeCurrentChunk')
    Sys.sleep(.2)
    print('First Command Complete')
    
    rstudioapi::navigateToFile( file = 'Example_Notebook.Rmd' , line = 15  )
    Sys.sleep(.2)
    rstudioapi::executeCommand(commandId = 'executeCurrentChunk')
    Sys.sleep(.2)
    print('Second Command Complete')
}

MyNewFunction()
Run Code Online (Sandbox Code Playgroud)

它运行,但当我查看 Example_Notebook.Rmd 文件时,Chunk_1 显示输出,但 Chunk_3 不显示。
RMD输出

我的光标在第 15 行结束,因此看起来它运行了 navigatorToFile、Sleep 命令和 print 命令,但它会等待executeCommand,直到整个函数完成。

我还尝试将函数中的代码放在自己的文件中,然后使用 source() ,以及将代码包装在 rstudioapi::sendToConsole() 中,但发生了同样的事情。

这几乎就像我需要在一个命令中执行 2 个单独的顶级任务,但我不确定这是否可能,甚至在技术上是否有意义。

查看 Rstudio 中的 C++ 和 java 代码,似乎“运行上面的所有块”命令将所有块放入一个作用域中并使用函数“executeScopedChunks”。不幸的是,我根本不懂 C++ 或 java,所以我真的不了解更多。它可能没有帮助,但以防万一,我在这里查看: https: //github.com/rstudio/rstudio/blob/master/src/gwt/src/org/rstudio/studio/client/工作台/视图/源/编辑器/文本/TextEditingTarget.java#L5754

有什么办法可以解决这个问题吗?任何帮助将不胜感激!

小智 0

首先,您可以尝试“视觉”版本而不是“源”版本,它可能会让生活更轻松:

在此输入图像描述

然后,您可以单击“设置”图标将块 2 或任何您不想运行的块更改为“不显示任何内容(不运行代码)”:

在此输入图像描述

如果您想在不进行编织的情况下运行所有​​其他块,只需单击工具栏右上角的“运行”按钮即可。单击“运行全部”或您喜欢的其他命令。

在此输入图像描述