How to pass command-line arguments when calling source() on an R file within another R file

I assume the sourced script accesses the command line arguments with commandArgs? If so, you can override commandArgs in the parent script to return what you want when it is called in the script you're sourcing. To see how this would work:

file_to_source.R

print(commandArgs())

main_script.R

commandArgs <- function(...) 1:3
source('file_to_source.R')

outputs [1] 1 2 3

If your main script doesn't take any command line arguments itself, you could also just supply the arguments to this script instead.


The simplest solution is to replace source() with system() and paste. Try

arg1 <- 1
arg2 <- 2
system(paste("Rscript file_to_source.R", arg1, arg2))

If you have one script that sources another script, you can define variables in the first one that can be used by the sourced script.

> tmpfile <- tempfile()
> cat("print(a)", file=tmpfile)
> a <- 5
> source(tmpfile)
[1] 5

An extended version of @Matthew Plourde's answer. What I usually do is to have an if statement to check if the command line arguments have been defined, and read them otherwise.

In addition I try to use the argparse library to read command line arguments, as it provides a tidier syntax and better documentation.

file to be sourced

 if (!exists("args")) {
         suppressPackageStartupMessages(library("argparse"))
         parser <- ArgumentParser()
         parser$add_argument("-a", "--arg1", type="character", defalt="a",
               help="First parameter [default %(defult)s]")
         parser$add_argument("-b", "--arg2", type="character", defalt="b",
               help="Second parameter [default %(defult)s]")
         args <- parser$parse_args()
 }

 print (args)

file calling source()

args$arg1 = "c" 
args$arg2 = "d"
source ("file_to_be_sourced.R")

c, d