#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)
подход звучит умно).