[R] Calling r-scripts with arguments from other scripts, or possibly R programming conventions/style guide

MacQueen, Don m@cqueen1 @end|ng |rom ||n|@gov
Wed Jun 13 22:21:07 CEST 2018


When I want to run multiple scripts one after the other, and have variables created in a script be still in memory for use by a subsequent script, I normally create a master script (say, "runall.r") and it sources each of the others in turn. For example, my master script (runall.r) would look like this:

## master script (runall.r)
source('script1.r')
source('script2.r')
source('script3.r')
cat('[runall.r] Done\n')
## end of master script

Then, optionally, I can pass command line arguments to runall.r and parse them before sourcing the other scripts.

Since all three scripts are run in the same R session, all variables in memory when script1 finishes will be available to script2, and so on.

If you want to have each of the scripts be executable (by which I mean you run them by typing their name at the command line in a Linux environment; I don't know how it's done in Windows) and have the results of script1 be used as command line arguments to script2 -- well, I'm sure it can be done, but I don't think R's way of doing things is conducive to this approach. If you want to go that route, look up the --save, --no-save, --restore, and --no-restore arguments to R scripts.

See also the help page for Rscript [type help('Rscript') or ?Rscript at the R prompt] if you haven't already.

In my opinion, there are pros and cons to William Dunlap's suggestion to embed everything in functions in a package. I do it either way, depending on various factors. I would suggest, however, that you wait until you have more R experience before trying that route.

Incidentally, this construct:

  fileConn<-file("output.txt") 
  writeLines(c(TotalDeviation, IndividualDeviation, RecenterPeriods), fileConn)
  close(fileConn)

looks to me like it's more complex than needed.
I would suggest

  cat( TotalDeviation, IndividualDeviation, RecenterPeriods, '\n', file='output.txt')


--
Don MacQueen
Lawrence Livermore National Laboratory
7000 East Ave., L-627
Livermore, CA 94550
925-423-1062
Lab cell 925-724-7509
 
 

On 6/12/18, 7:33 PM, "R-help on behalf of Sam Tuck" <r-help-bounces using r-project.org on behalf of STuck using nzsuperfund.co.nz> wrote:

    Hi All,
              I am new to R and am wondering if there is a way to pass arguments between rscripts.  I have this working but have had to create a C# shell calling the scripts in sequence via windows scripting which enables command line arguments to get the necessary interaction.  
    
    I'm wondering if I'm using an outdated program construction technique - I create r files like I would programme functions or reoccurring code snippets in C.  It may be that r was not designed to create lots of little r script modules that interact via a master script? 
    
    Ideally I'd like to call r scripts from other r scripts and have all the variables still in memory: For example
    
    I've been using RStudio Version 1.1.447 to programme and regression test my individual scripts,. 
    
    Script Arg Script.R
    {
    # We are going to pass arguments into this script
    arguments <- commandArgs(trailingOnly = TRUE)
    #arguments[1] is double
    #arguments[2] is double
    #arguments[3] is double.
    if(length(arguments) <3) 
    {
      stop("Not enough arguments, please supply 3, [% dbl}total deviation, [% dbl] individual deviation, [int] periods before recenter")
    }
    TotalDeviation <- as.numeric(arguments[1])/100
    IndividualDeviation <- as.numeric(arguments[2])/100
    RecenterPeriods <- as.numeric(arguments[3])
    # We then manipulate some objects based on these inputs, but for this test we will output them to a file. 
    fileConn<-file("output.txt")
    writeLines(c(TotalDeviation, IndividualDeviation, RecenterPeriods), fileConn)
    close(fileConn)
    }
    Script RunningScript.R
    {
    Arg Script.R 0.6 0.4 132
    }
    
    To which I get
    Error: unexpected symbol in " Arg Script.R"
    
    When I use the script RunningScript.R
    {
    system(paste("Arg Script.R", 0.8, 0.4, 132))
    }
    Nothing occurs (there is no output file created, but also no error)
    
    When I use RunningScript.R
    {
    commandArgs <- c(0.6,0.4,132)
    source("Arg Script.R')
    }
    I don't get any args passed into the file.  Instead getting the error 
    Not enough arguments, please supply 3, [% dbl}total deviation, [% dbl] individual deviation, [int] periods before recenter
    
    Thanks
    
    Sam Tuck 
    
    ______________________________________________
    R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
    https://stat.ethz.ch/mailman/listinfo/r-help
    PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
    and provide commented, minimal, self-contained, reproducible code.
    



More information about the R-help mailing list