2015-07-14 5 views
4

Есть ли возможность скопировать исполняемые строки или в основном сценарий в рабочий каталог?Сценарий копирования после выполнения

Так что у меня нормальный сценарий, у меня есть отдельный сценарий, который просто нужно найти в рабочем каталоге, и они будут делать все, что мне нужно. Через несколько месяцев я сделал обновление для этих сценариев, и я хотел бы получить снимок из сценария, когда я выполнил исходный код ...

Так что в основном file.copy(ITSELF, '.') или что-то в этом роде.

+0

Возможно, вы можете немного изменить свой подход и использовать небольшой вспомогательный скрипт, который выполняет что-то вроде 'file.copy (« myscript.r », paste0 (« snapshot_ », Sys.Date(),« _ myscript.r »)); источник ("MyScript.r ")' – nrussell

+0

Будет работать, я думаю, но нет ли функции, чтобы получить собственное имя файла и путь? Я думал, что использовал что-то вроде этого в python, но это использовало командную строку. Там я мог получить первый аргумент (filename). Интересно, не мог ли источник вернуть что-то вроде этого ... – drmariod

+0

Я бы не удивил меня, если бы была такая функция в Python, поскольку Python предоставляет полезные мета-функции, такие как атрибут '__self__' в определениях классов Я не знаю о чем-то вроде описанного выше ('file.copy (ITSELF, '.')') В R, но у кого-то может быть лучшее решение. – nrussell

ответ

5

Я думаю, что это то, что вы ищете:

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) 
+0

Спасибо Молькс, это то, что я только что нашел, но я не совсем понимаю функцию sys.frame. Не могли бы вы объяснить это немного, и почему это невозможно использовать в терминале? – drmariod

+0

@drmariod Я добавил некоторую информацию в ответ. – Molx

+0

Спасибо за дополнительную информацию. Я понял, есть также переменные 'filename' и' srcfile', которые, похоже, имеют одинаковую информацию ... Во всяком случае, я поеду на 'inile', так как я также нашел некоторые рекомендации по его использованию. Спасибо за решение. – drmariod

0

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

try({ 
    script_name <- sys.frame(1)$ofile 
    copy_script_name <- 
    paste0(sub('\\.R', '', basename(script_name)), 
      '_', 
      format(Sys.time(), '%Y%m%d%H%M%S'), 
      '.R') 
    file.copy(script_name, 
      copy_script_name) 
}) 

Это будет скопировать скрипт в текущий каталог, а также добавляет отметку времени для имени файла. В случае, если что-то пойдет не так, остальная часть скрипта будет выполняться.

Смежные вопросы