繁体   English   中英

如何从具有多种增强类型(包括列表)的命令行调用 R 脚本

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

我已经为此工作了一段时间,但我仍然陷入困境。

我想从本质上是一个命令行(Snakemake 文件)中使用多个参数调用一个 Rscript。 我要问的内容与我在 SO 上看到的内容之间的主要区别( 如何将参数列表传递给 R 中的方法?如何将数组作为参数传递给 R 脚本命令行运行?是否可以传递整个列表作为 R 中的命令行参数)是我的参数是字符串、数字列表的组合。

这是我的规则中的设置(Snakemake 文件):

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

以下是该调用的翻译:

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

其中sample_files = integrated_seurat_objects是一个列表,其中包含:

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

这是我的 R 脚本的开头:

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)

如果我使用整个integrated_seurat_objects列表,这就是返回的内容:

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

如果我从integrated_seurat_objects中获取第一个条目并将其作为参数传递,我会得到(我已经替换了实际的项目名称和路径是这篇文章):

[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"

它似乎可行,但我还没有破解它。 如何从命令行将包含列表的多个参数传递给 R 脚本? 任何帮助都将受到赞赏。

@MrFlick 这个答案值得称赞。 问题是我没有考虑参数数量大于 7(duh)的情况。

快速修复:

if (length(args) < 7) 
{
  stop('At least seven arguments must be supplied.', call.=FALSE)
} 

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

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:length(args)]
} 

谢谢你的眼睛@MrFlick

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM