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 不显示。

我的光标在第 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 或任何您不想运行的块更改为“不显示任何内容(不运行代码)”:
如果您想在不进行编织的情况下运行所有其他块,只需单击工具栏右上角的“运行”按钮即可。单击“运行全部”或您喜欢的其他命令。