Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy script after executing

Tags:

r

Is there a possibility to copy the executed lines or basically the script into the working directory?

So my normal scenario is, I have stand alone script which just need to be sourced within a working directory and they will do everything I need. After a few month, I made update to these scripts and I would love to have a snapshot from the script when I executed the source...

So basically file.copy(ITSELF, '.') or something like this.

like image 927
drmariod Avatar asked Mar 15 '23 10:03

drmariod


1 Answers

I think this is what you're looking for:

file.copy(sys.frame(1)$ofile,
          to = file.path(dirname(sys.frame(1)$ofile),
                         paste0(Sys.Date(), ".R")))

This will take the current file and copy it to a new file in the same directory with the name of currentDate.R, so for example 2015-07-14.R

If you want to copy to the working directory instead of the original script directory, use

file.copy(sys.frame(1)$ofile,
          to = file.path(getwd(),
                         paste0(Sys.Date(), ".R")))

Just note that the sys.frame(1)$ofile only works if a saved script is sourced, trying to run it in terminal will fail. It is worth mentioning though that this might not be the best practice. Perhaps looking into a version control system would be better.

Explanation:

TBH, I might not be the best person to explain this (I copied this idea from somewhere and use it sometimes), but I'll try. Basically in order to have information about the script file R needs to be running it as a file inside an environment with that information, and when that environment is a source call it contains the ofile data. We use (1) to select the next (source()'s) environment following the global environment (which is 0). When you're running this from terminal, there's no frame/environment other than Global (that's the error message), since no file is being ran - the commands are sent straight to terminal.

To illustrate that, we can do a simple test:

> sys.frame(1)
Error in sys.frame(1) : not that many frames on the stack

But if we call that from another function:

> myf <- function() sys.frame(1)
> myf()
<environment: 0x0000000013ad7638>

Our function's environment doesn't have anything in it, so it exists but, in this case, does not have ofile:

> myf <- function() names(sys.frame(1))
> myf()
character(0)
like image 138
Molx Avatar answered Mar 27 '23 17:03

Molx