Я думаю, что это то, что вы ищете:
file.copy(sys.frame(1)$ofile,
to = file.path(dirname(sys.frame(1)$ofile),
paste0(Sys.Date(), ".R")))
Это займет текущий файл и скопировать его в новый файл, в том же каталоге и с именем currentDate.R, так например 2015-07-14.R
Если вы хотите скопировать в рабочую директорию вместо оригинального каталога сценария, используйте
file.copy(sys.frame(1)$ofile,
to = file.path(getwd(),
paste0(Sys.Date(), ".R")))
Сразу отметим, что sys.frame(1)$ofile
работает только при сохранении сохраненного скрипта, попытка его запуска в терминале завершится с ошибкой. Следует отметить, что это может быть не самая лучшая практика. Возможно, лучше изучить систему контроля версий.
Объяснение:
ТВН Я не мог бы быть лучшим человеком, чтобы объяснить это (я скопировал эту идею где-то и использовать его иногда), но я буду стараться. В основном, чтобы иметь информацию о файле сценария R, нужно запускать его как файл внутри среды с этой информацией, и когда эта среда является вызовом source
, она содержит данные ofile
. Мы используем (1)
для выбора следующей (source()
) среды, следующей за глобальной средой (0
). Когда вы запускаете это из терминала, нет никакого фрейма/среды, отличной от Global (это сообщение об ошибке), поскольку файл не запускается - команды отправляются прямо на терминал.
Для иллюстрации того, что мы можем сделать простой тест:
> sys.frame(1)
Error in sys.frame(1) : not that many frames on the stack
Но если мы называем это из другой функции:
> myf <- function() sys.frame(1)
> myf()
<environment: 0x0000000013ad7638>
среда Наша функция в не имеет ничего в ней, так она существует, но, в данном случае, не имеет oflile
:
> myf <- function() names(sys.frame(1))
> myf()
character(0)
Возможно, вы можете немного изменить свой подход и использовать небольшой вспомогательный скрипт, который выполняет что-то вроде 'file.copy (« myscript.r », paste0 (« snapshot_ », Sys.Date(),« _ myscript.r »)); источник ("MyScript.r ")' – nrussell
Будет работать, я думаю, но нет ли функции, чтобы получить собственное имя файла и путь? Я думал, что использовал что-то вроде этого в python, но это использовало командную строку. Там я мог получить первый аргумент (filename). Интересно, не мог ли источник вернуть что-то вроде этого ... – drmariod
Я бы не удивил меня, если бы была такая функция в Python, поскольку Python предоставляет полезные мета-функции, такие как атрибут '__self__' в определениях классов Я не знаю о чем-то вроде описанного выше ('file.copy (ITSELF, '.')') В R, но у кого-то может быть лучшее решение. – nrussell