将R脚本应用于多个文件

时间:2014-08-13 14:26:23

标签: r function loops lapply

我有一个R脚本,它读取某种类型的文件(系统发育树的nexus文件),其名称以* .trees.txt结尾。然后它从名为bGMYC的R包中应用许多函数,可用here并创建3个pdf文件。我想知道我应该做些什么来使脚本循环遍历14种物种中的每一种。

输入文件位于每个物种的单独文件夹中,但如果能够完成任务,我可以将它们全部放在一个文件夹中。理想情况下,我想将pdf文件输出到每个物种的文件夹,不同于包含输入文件的物种。

这是脚本

# Call Tree file
trees <- read.nexus("L_boscai_1411_test2.trees.txt")

# To use with different species, substitute "L_boscai_1411_test2.trees.txt" by the path to each species tree

#Store the number of tips of the tree
ntips <- length(trees$tip.label[[1]])

#Apply bgmyc.single
results.single <- bgmyc.singlephy(trees[[1]], mcmc=150000, burnin=40000, thinning=100, t1=2, t2=ntips, start=c(1,1,ntips/2))

#Create the 1st pdf
pdf('results_single_boscai.pdf')
plot(results.single)
dev.off()

#Sample 50 trees
n <- sample(1:length(trees), 50)
trees.sample <- trees[n]

#Apply  bgmyc.multiphylo  
results.multi <- bgmyc.multiphylo(trees.sample, mcmc=150000, burnin=40000, thinning=100, t1=2, t2=ntips, start=c(1,1,ntips/2))

#Create 2nd pdf
pdf('results_boscai.pdf')     # Substitute 'results_boscai.pdf' by "*speciesname.pdf"
plot(results.multi)
dev.off()

#Apply bgmyc.spec and spec.probmat 
results.spec <- bgmyc.spec(results.multi)
results.probmat <- spec.probmat(results.multi)

#Create 3rd pdf
pdf('trees_boscai.pdf')     # Substitute 'trees_boscai.pdf' by "trees_speciesname.pdf"
for (i in 1:50) plot(results.probmat, trees.sample[[i]])
dev.off()

我已经阅读了几个类似问题的帖子,但它们几乎总是涉及.csv文件,引用单个文件夹中的多个文件,有一个更简单的脚本或者不需要输出文件到单独的文件夹,所以我无法找到解决我的具体问题的方法。

我应该使用for循环,还是可以使用此lapply或其他类型的apply创建一个函数?您能否为我提供您提出的解决方案的示例代码,或者指向我的教程或其他参考资料?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这实际上取决于您想要运行它的方式。 如果您使用linux /命令行作业提交,最好查看

How can I read command line parameters from an R script?

如果你正在使用GUI(Rstudio ......),你可能不熟悉这个,所以我会解决这个问题 作为一个函数或一个循环。

首先,获取所有文件名。

files = list.files(path = "your/folder")
# Now you have list of your file name as files. Just call each name one at a time
# and use for loop or apply (anything of your choice)

由于您需要命名pdf文件,您可以使用您的文件名或索引(例如循环计数器)并附加到所需的文件名。 (例如粘贴(&#34; single_boscai&#34;,&#34; i&#34;))

在你的情况下,

 files = list.files(path = "your/folder")
    # Use pattern = "" if you want to do string matching, and extract
    # only matching files from the source folder.

    genPDF = function(input) {
      # Read the file
      trees <- read.nexus(input)
      # Store the index (numeric)
      index = which(files == input)

      #Store the number of tips of the tree
      ntips <- length(trees$tip.label[[1]])

      #Apply bgmyc.single
      results.single <- bgmyc.singlephy(trees[[1]], mcmc=150000, burnin=40000, thinning=100, t1=2, t2=ntips, start=c(1,1,ntips/2))

      #Create the 1st pdf
      outname = paste('results_single_boscai', index, '.pdf', sep = "")
      pdf(outnam)
      plot(results.single)
      dev.off()

      #Sample 50 trees
      n <- sample(1:length(trees), 50)
      trees.sample <- trees[n]

      #Apply  bgmyc.multiphylo  
      results.multi <- bgmyc.multiphylo(trees.sample, mcmc=150000, burnin=40000, thinning=100, t1=2, t2=ntips, start=c(1,1,ntips/2))

      #Create 2nd pdf
      outname = paste('results_boscai', index, '.pdf', sep = "")
      pdf(outname)     # Substitute 'results_boscai.pdf' by "*speciesname.pdf"
      plot(results.multi)
      dev.off()

      #Apply bgmyc.spec and spec.probmat 
      results.spec <- bgmyc.spec(results.multi)
      results.probmat <- spec.probmat(results.multi)

      #Create 3rd pdf
      outname = paste('trees_boscai', index, '.pdf', sep = "")
      pdf(outname)     # Substitute 'trees_boscai.pdf' by "trees_speciesname.pdf"
      for (i in 1:50) plot(results.probmat, trees.sample[[i]])
      dev.off()
    }


    for (i in 1:length(files)) {
      genPDF(files[i])
    }