【问题标题】:Self-reference Rmd file in interactive mode交互模式下的自引用 Rmd 文件
【发布时间】: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


【解决方案1】:

rstudioapi::getSourceEditorContext() 为您提供有关在 RStudio 源代码编辑器中打开的当前文件的信息(列表)。文件的路径存储在列表的path 元素中。

顺便说一句,对于非交互式 R 会话,knitr::current_input() 为您提供了正在编织的源文档的路径(不过,您的 sys.call(1) 方法听起来很聪明)。

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多