Файл Rmd с самостоятельной ссылкой в интерактивном режиме

#r #rstudio #r-markdown #knitr

#r #rstudio #r-markdown #knitr

Вопрос:

Я заинтересован в прикреплении метаданных к сохраненным объектам, включая скрипт, который сохранил данные. С этой целью я хотел бы получить имя скрипта в самом скрипте.

Когда у меня есть документ 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 в интерактивном сеансе?

Комментарии:

1. Это звучит сложно… насколько я понимаю (то есть, лучше всего предположить), интерактивные команды отправляются на консоль для выполнения редактором (в данном случае RStudio) — поэтому сам сеанс R не имеет возможности узнать, была ли команда скопирована / вставлена, отправлена RStudio из какого-либо файла, введена вручную и т. Д.

2. Обратите внимание, например, что вы можете получить доступ YAML к метаданным с помощью rmarkdown::metadata , но это также не будет доступно в интерактивном режиме, поскольку YAML не анализируется интерактивным сеансом R. Возможно, ваш файл еще даже не сохранен. Я думаю, что лучше всего было бы определить заголовок / имя / идентификатор в R-коде в начале документа.

3. Да, я боялся, что это будет сложно. Я надеялся, что, поскольку getwd() при выполнении в фрагменте кода результаты будут отличаться от результатов на консоли, может быть, есть какой-то способ отличить консоль от фрагмента кода. (По крайней мере, когда .Rmd не находится в текущем каталоге).

4. Поиграв еще немного, rstudioapi::getActiveDocumentContext() кажется, знает, выполняется ли он в чанке или в консоли. Недостатком является то, что он сообщает путь к временному файлу.

5. Если есть ответ, я думаю, что это правильный путь. Для этого не будет стандартного R или даже knitr команд, но rstudioapi , похоже, это хорошее место для начала. Я имею в виду, что RStudio определенно знает, что происходит, вопрос в том, доступно ли это для сеанса R.

Ответ №1:

rstudioapi::getSourceEditorContext() предоставляет информацию (список) о текущем файле, открытом в редакторе исходных текстов RStudio. Путь к файлу хранится в path элементе списка.

Кстати, для неинтерактивных сеансов R knitr::current_input() указывает путь к связываемому исходному документу (хотя ваш sys.call(1) подход звучит умно).