【发布时间】:2021-01-07 15:14:27
【问题描述】:
我有兴趣将元数据附加到保存的对象,包括保存数据的脚本。为此,我想在脚本本身中捕获脚本的名称。
当我有一个如下的 Rmarkdown 文档并编织它时,代码块会生成生成它的脚本的名称。这正是我想要的,但是,这仅在文档被编织时才有效。如果我以交互方式在 Rstudio 中执行块,我也想做同样的事情。
---
title: "test"
author: "me"
date: "21/09/2020"
output: html_document
---
```{r}
if (interactive()) {
# Get the same as non-interactive version?
} else {
as.character(sys.call(1))[2]
}
```
有人知道如何在交互式会话中捕获当前 Rmarkdown 脚本的名称吗?
【问题讨论】:
-
这听起来很难......我的理解(也就是说,最好的猜测)是交互式命令被发送到控制台以由编辑器(在这种情况下为 RStudio)执行 - 所以 R 会话本身无法知道命令是否被复制/粘贴、由 RStudio 从某个文件发送、手动输入等。
-
请注意,例如,您可以使用
rmarkdown::metadata访问YAML元数据,但这也不能以交互方式使用,因为交互式 R 会话不会解析 YAML。您的文件甚至可能尚未保存。我认为您最好的选择可能是在文档的早期在 R 代码中定义标题/名称/id。 -
是的,我担心这会很难。我有点希望,因为
getwd()在代码块中执行的结果与在控制台中执行的结果不同,所以可能有一些方法可以将控制台与代码块区分开来。 (至少当 .Rmd 不在当前目录中时)。 -
玩了一会儿,
rstudioapi::getActiveDocumentContext()似乎知道它是在块中执行还是在控制台中执行。缺点是它会报告一个临时文件的路径。 -
如果有答案,我认为这是正确的轨道。不会有标准的 R 甚至
knitr命令,但rstudioapi似乎是一个不错的起点。我的意思是,RStudio 肯定知道发生了什么,问题是 R 会话是否可用。
标签: r rstudio r-markdown knitr