调用R脚本传参时遇setwd报错:无法更改工作目录
问题重现
通过命令行调用R脚本时触发错误:
Error in setwd(args[8]) : cannot change working directory Execution halted
调用命令:
Rscript /home/mike/learn-analysis/SL_input.R chr21 10542449 10542649 + Y Y 1 /mnt/prep/learn/CA-21-10542394-10542448.2.D.txt D /home/mike/learn-analysis/SL_table.R
SL_table.R代码:
args <- commandArgs(trailingOnly = TRUE) setwd(args[8]) # directory to write file to source(args[11]) # can be updated to reflect location of source code results<-SL_mutate(args[1],args[2],args[3],args[4],args[5],args[6],args[7]) # chrom, start, stop, strand, gene, transcript, exon number results$type<-args[10] results$transcript<-NULL results$exon_num<-NULL write.table(results,args[9],quote = F, row.names = F, sep="\t") # write to filename given in argument (in working directory)
错误核心原因
你在脚本里写的setwd(args[8])是把第8个命令行参数当作工作目录,但实际传入的第8个参数是/mnt/prep/learn/CA-21-10542394-10542448.2.D.txt——这是个文件名,不是目录路径,自然没法切换到这个路径,所以触发报错。
解决思路
修正参数与脚本的对应关系
- 要么调整命令行参数顺序,把目标工作目录放在第8位,文件名往后挪;
- 要么修改
SL_table.R里的代码,把setwd的参数索引改成对应目录的位置(比如如果目录是新增参数,要同步调整索引)。
先验证参数索引是否正确
在脚本开头加一行打印代码,确认每个索引对应的参数内容,避免索引错位:args <- commandArgs(trailingOnly = TRUE) print(args) # 打印所有传入的参数,核对每个位置的实际值替代方案:不切换工作目录,直接用完整路径写文件
没必要强制切换工作目录,直接拼接目录和文件名的完整路径传给write.table更稳妥,示例:# 假设第8位是目标目录,第9位是文件名 output_dir <- args[8] output_filename <- args[9] full_output_path <- file.path(output_dir, output_filename) # 可选:如果目录不存在则创建 if (!dir.exists(output_dir)) { dir.create(output_dir, recursive = TRUE) } write.table(results, full_output_path, quote = F, row.names = F, sep="\t")检查目录权限
就算参数对应正确,也要确保运行R脚本的用户对目标目录有读写权限。可以用命令行测试:cd /目标目录路径 touch test_perm.txt # 能创建文件说明有权限,否则需要调整目录权限
内容的提问来源于stack exchange,提问作者Jerry Vfc
相关产品推荐
相关产品推荐

