![](/img/trans.png)
[英]R: Reticulate -- How to call a Python script that requires multiple command line arguments
[英]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.