'How to call R script from command line with multiple augument types (inc. list)

I have been working on this for a while and I am still stuck.

I would like to call an Rscript using multiple arguments from what is essentially a command line (Snakemake file). The main difference between what I am asking and what I see on SO (How to pass list of arguments to method in R?, How can I pass an array as argument to an R script command line run?, Is it possible to pass an entire list as a command line argument in R) is that my arguments are a combination of strings, numbers, and a list.

Here is the set up in my rules (Snakemake file):

rule cluster_plots_DGE:
   input:
      script = 'src/scripts/create_images_DGE.R',
      analyze_sc_object_output = sc_objects
   params:
      project = PROJECT,
      method = METHOD,
      rpath = RPATH,
      storage=STORAGE,
      components = COMPONENTS,
      reso_file = resolution_file,
      sample_files = integrated_seurat_objects 
   output: dge_files
   log:
      log_output = log_directory + PROJECT.lower() + '_DGE.log'
   shell:
      "Rscript {input.script} {params.project} {params.method} {params.rpath} {params.storage} {params.components} {params.reso_file} {params.sample_files} 2> {log.log_output}"

Here is what the call translates to:

Rscript src/scripts/create_images_DGE.R project_name ALL path_to_R_installed_libraries rds 50 data/endpoints/project_name/analysis/PCA_14/tables/project_nameR_resolution_list.txt data/endpoints/project_name/analysis/PCA_14/RDS/project_name_Standard_0.5.RDS data/endpoints/project_name/analysis/PCA_14/RDS/project_name_RPCA_0.5.RDS data/endpoints/project_name/analysis/PCA_14/RDS/project_name_SCT_0.5.RDS 2> logs/DGE_Markers/project_name_DGE.log

Where sample_files = integrated_seurat_objects is a list containing:

data/endpoints/project_name/analysis/PCA_14/RDS/project_name_Standard_0.5.RDS, 
data/endpoints/project_name/analysis/PCA_14/RDS/project_name_RPCA_0.5.RDS, 
data/endpoints/project_name/analysis/PCA_14/RDS/project_name_SCT_0.5.RDS

And here is the beginning of my R script:

args = commandArgs(trailingOnly=TRUE)
compo <- ''
project <- ''
method <- ''
lib_path <- ''
storage <- ''
res_file <- ''
integrated_object <- ''   #list of objects 

# test if there is at least 7 arguments: if not, return an error
if (length(args) < 7) {
  stop('At least seven arguments must be supplied.', call.=FALSE)
} else if (length(args)==7) {
   project = args[1] 
   method = args[2] 
   lib_path = args[3]
   storage = args[4]
   compo = args[5]
   res_file = args[6]
   integrated_object = args[7]
   #integrated_object = eval(parse(text=args[7]))
}

print(compo)
print(project)
print(method)
print(lib_path)
print(storage)
print(res_file)
print(integrated_object)

If I use the entire integrated_seurat_objects list, this is what gets returned:

[1] ""
[1] ""
[1] ""
[1] ""
[1] ""
[1] ""
[1] ""

If I take the first entry from integrated_seurat_objects and pass that as an argument, I get (I have replaced the actual project name and paths is this post):

[1] "50"
[1] project_name
[1] "ALL"
[1] library_path_to_R_libraries
[1] "rds"
[1] "data/endpoints/project_name/analysis/PCA_14/tables/project_name_resolution_list.txt"
[1] "data/endpoints/project_name/analysis/PCA_14/RDS/project_name_Standard_0.5.RDS"

It seems do-able but I have not cracked it yet. How can I pass multiple arguments that include a list to an R script form the command line? Any assistance is always appreciated.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source