Na moją pracę biegam skrypty na maszynach wirtualnych na klastrze komputerowym. Te zadania są zazwyczaj duże i mają duże wyjście. Chciałbym zrobić skrypt za pośrednictwem terminalu. W końcu skrypt tworzy duplikat samego siebie tak, że zawiera każdą linię, która była częścią skryptu (minus ostatni, jeśli to konieczne). Jest to dość niezbędne dla replikacji i debugowania w moim życiu pracy, ponieważ czasami nie widzę, które parametry lub zmienne Szczególne zadanie zawarte, ponieważ przesyłasz ten sam skrypt wielokrotnie tylko z nieco różnymi parametrami, a foldery nie mogą być kontrolowane.

Wyobraź sobie ten plik test.R:

a <- rnorm(100)


#test

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

Teraz uruchomiłem to za pośrednictwem konsoli na moim węźle wirtualnym i uzyskać następujący błąd:

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

Czy jest jakieś polecenie, takie jak save history, które działa w skrypcie, który jest właśnie wykonany?

Żądany wynik to plik o nazwie test2.R jest zapisany, który zawiera to:

a <- rnorm(100)


#test

# Saving history for reproducibility to folder
0
JAQuent 28 październik 2020, 17:41

1 odpowiedź

Najlepsza odpowiedź

Zamiast tego możesz skopiować plik. Ponieważ używasz Rscript, nazwa skryptu jest zawarta w commandArgs() w formularzu --file=test.R. Prosta funkcja, tak jak zwróci ścieżkę skryptu wykonującego:

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)
}

Następnie możesz skopiować plik, jak widać. Na przykład dołączanie ".backup":

script_name <- get_filename()
backup_name <- paste0(script_name, ".backup")
file.copy(script_name, backup_name)
1
Nash D Delcamp 28 październik 2020, 16:05