我有一个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
创建一个函数?您能否为我提供您提出的解决方案的示例代码,或者指向我的教程或其他参考资料?
感谢您的帮助。
答案 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])
}