Сохранение истории для запуска скрипта Rscript через терминал / консоль

по работе я запускаю сценарии на виртуальных машинах в компьютерном кластере. Эти работы обычно большие и имеют большую производительность. Я бы хотел запустить сценарий через терминал. В конце скрипт создает свою копию, так что он содержит каждую строку, которая была частью скрипта (за вычетом последней, если это необходимо). Это очень важно для воспроизводимости и отладки в моей рабочей жизни, потому что я иногда не могу видеть, какие параметры или переменные включены в конкретное задание, поскольку я отправляю один и тот же сценарий несколько раз, только с немного разными параметрами, и папки не могут контролироваться версиями.

Представьте себе этот файл test.R:

a <- rnorm(100)


#test

# Saving history for reproducibility to folder
savehistory(file = 'test2.R')

Теперь я запускаю это через консоль на моем виртуальном узле и получаю следующую ошибку:

[XX home]$ Rscript test.R 
Error in.External2(C_savehistory, file): no history available to save
Calls: save history
Execution halted

Есть ли какая-нибудь команда типа save history, которая работает внутри только что выполненного скрипта?

Желаемый результат - файл с именем test2.R сохраняется, который содержит следующее:

a <- rnorm(100)


#test

# Saving history for reproducibility to folder

person JAQuent    schedule 28.10.2020    source источник
comment
Есть ли причина, по которой Rscript test.R не работает? История, сохраняемая при запуске сценария, будет просто самим сценарием, верно?   -  person Dason    schedule 28.10.2020
comment
Да, это был бы план, но он не работает, по крайней мере, на моей виртуальной машине Linux.   -  person JAQuent    schedule 28.10.2020
comment
Нет, я спрашиваю, почему вам нужно записывать историю в test2.R, потому что все, что теоретически могло бы содержать, было бы содержимым test.R. Какова цель создания test2.R, если test.R уже содержит желаемый результат?   -  person Dason    schedule 28.10.2020
comment
Потому что я хочу создать точную копию сценария, который я использовал для отправки задания, и сохранить его с отметкой времени, чтобы я мог вернуться к нему позже, когда задание будет выполнено, и посмотреть на него снова без каких-либо последующих изменений, которые вносятся для повторной отправки с разницей в параметрах.   -  person JAQuent    schedule 28.10.2020


Ответы (1)


Вместо этого вы можете скопировать файл. Поскольку вы используете Rscript, имя сценария включается в commandArgs() в форме --file=test.R. Такая простая функция вернет путь к исполняющемуся скрипту:

get_filename <- function() {
  c_args <- commandArgs()
  r_file <- c_args[grepl("\\.R$", c_args, ignore.case = TRUE)]
  r_file <- gsub("--file=", "", r_file)
  r_file <- normalizePath(r_file)
  return(r_file)
}

Затем вы можете скопировать файл так, как считаете нужным. Например, добавление .backup:

script_name <- get_filename()
backup_name <- paste0(script_name, ".backup")
file.copy(script_name, backup_name)
person Nash D Delcamp    schedule 28.10.2020