在for循环中通过系统运行代码时不执行命令

时间:2019-03-22 19:48:49

标签: r for-loop

这是我第一次用两个变量创建一个for循环。我有一堆要进行的DNA测序样品。每组数据都有两个需要同时运行的文件。

当我只在R中运行不带for循环变量的system(paste())时,它就可以正常工作。所以我知道问题出在循环本身。当我运行下面的脚本时,没有收到错误,它运行但没有任何反应。

我显然搞砸了。我只是不知道从这里去哪里。

for (j in list.files(pattern = "R1_001.trim.paired.fastq.gz")) {
  for (h in list.files(pattern = "R2_001.trim.paired.fastq.gz")) {
    outname=paste(substr(j, start=1, stop=7), sep= "")
    system(paste("docker run -v /path/:/path/ -w /path/ combinelab/salmon salmon quant -i /path/CanFam3.1_index -l A -1 ",j,"-2 ",h,"-o ",outname, ,sep="")
    )
  }
}

1 个答案:

答案 0 :(得分:1)

在您提供的代码中,我唯一能立即看到的就是缺少一些空格,这些空格可能导致观察到的行为。您也可以使用paste0代替paste(...,sep=""),希望以下内容能帮助您

for (j in list.files(pattern = "R1_001.trim.paired.fastq.gz")) {
  for (h in list.files(pattern = "R2_001.trim.paired.fastq.gz")) {
    outname=substr(j, start=1, stop=7)
    system(paste0("docker run -v /path/:/path/ -w /path/ combinelab/salmon salmon quant -i /path/CanFam3.1_index -l A -1 ",j," -2 ",h," -o ",outname))
  }
}

编辑

在for循环之外通过character(0)命令获得list.files表示您没有将wd中的任何文件与模式匹配。

如果您确定文件位于正确的wd中,或者直接在wd命令中设置list.fileslist.files(path = ".", pattern = NULL),则可以尝试以下方法的组合Sonny和Parfait在上面的注释中提到的内容是运行for循环,用system替换print,并在pattern命令中删除list.files规范,这将告诉您是否您会收到正确的docker字符串(尽管可能还会打印出不正确的文件,以便以后可以通过更新模式来进行过滤)。