-## write.tree.R (2007-12-22)
+## write.tree.R (2009-06-16)
## Write Tree File in Parenthetic Format
-## Copyright 2002-2007 Emmanuel Paradis
+## Copyright 2002-2009 Emmanuel Paradis and Daniel Lawson
## This file is part of the R-package `ape'.
## See the file ../COPYING for licensing issues.
x
}
-write.tree <- function(phy, file = "", append = FALSE,
- digits = 10)
+write.tree <-
+ function (phy, file = "", append = FALSE, digits = 10, tree.names = FALSE)
{
- if (class(phy) == "multiPhylo") {
- write.tree(phy[[1]], file = file,
- append = append, digits = digits)
+ output.tree.names <- FALSE
+ if (is.logical(tree.names)) {
+ output.tree.names <- tree.names
+ tree.names <- NULL
+ } else if (is.character(tree.names)) {
+ output.tree.names <- TRUE
+ names(phy) <- tree.names
+ }
+ if (output.tree.names)
+ names(phy) <- checkLabel(names(phy))
+ if (inherits(phy, "multiPhylo")) {
+ write.tree(phy[[1]], file = file, append = append,
+ digits = digits, tree.names = names(phy)[1])
if (length(phy) > 1)
- for (i in 2:length(phy))
- write.tree(phy[[i]], file = file,
- append = TRUE, digits = digits)
+ for (i in 2:length(phy)) write.tree(phy[[i]], file = file,
+ append = TRUE, digits = digits, tree.names = names(phy)[i])
return(invisible(NULL))
}
-
- if (class(phy) != "phylo")
- stop('object "phy" is not of class "phylo"')
-
+ if (!inherits(phy, "phylo"))
+ stop("object \"phy\" is not of class \"phylo\"")
brl <- !is.null(phy$edge.length)
-
-### Ne serait-il pas plus efficace de créer des node labels vides
-### "" et d'éviter l'évaluation if (nodelab) ????
-### Autre possibilité : créer plusieurs variants de ces fonctions
-### (au moins deux avec/sans edge.length)
-
-### Encore autre chose: les appels à which ne peuvent-ils pas
-### être évités ??? surtout si l'arbre est en cladewise order...
-
nodelab <- !is.null(phy$node.label)
phy$tip.label <- checkLabel(phy$tip.label)
- if (nodelab)
- phy$node.label <- checkLabel(phy$node.label)
-
+ if (nodelab) phy$node.label <- checkLabel(phy$node.label)
f.d <- paste("%.", digits, "g", sep = "")
-
cp <- function(s) STRING <<- paste(STRING, s, sep = "")
add.internal <- function(i) {
cp("(")
br <- which(phy$edge[, 1] == i)
for (j in br) {
desc <- phy$edge[j, 2]
- if (desc > n) add.internal(desc) else add.terminal(j)
- if (j != br[length(br)]) cp(",")
+ if (desc > n)
+ add.internal(desc)
+ else add.terminal(j)
+ if (j != br[length(br)])
+ cp(",")
}
cp(")")
- if (nodelab) cp(phy$node.label[i - n])
+ if (nodelab)
+ cp(phy$node.label[i - n])
if (brl) {
cp(":")
- cp(sprintf(f.d, phy$edge.length[which(phy$edge[, 2] == i)]))
+ cp(sprintf(f.d, phy$edge.length[which(phy$edge[,
+ 2] == i)]))
}
}
add.terminal <- function(i) {
}
}
n <- length(phy$tip.label)
- STRING <- "("
+ STRING <-
+ if (output.tree.names) paste(tree.names, "(", sep = "") else "("
br <- which(phy$edge[, 1] == n + 1)
for (j in br) {
desc <- phy$edge[j, 2]
- if (desc > n) add.internal(desc) else add.terminal(j)
- if (j != br[length(br)]) cp(",")
+ if (desc > n)
+ add.internal(desc)
+ else add.terminal(j)
+ if (j != br[length(br)])
+ cp(",")
}
if (is.null(phy$root.edge)) {
cp(")")
- if (nodelab) cp(phy$node.label[1])
+ if (nodelab)
+ cp(phy$node.label[1])
cp(";")
- } else {
+ }
+ else {
cp(")")
- if (nodelab) cp(phy$node.label[1])
+ if (nodelab)
+ cp(phy$node.label[1])
cp(":")
cp(sprintf(f.d, phy$root.edge))
cp(";")
}
- if (file == "") return(STRING)
+ if (file == "")
+ return(STRING)
else cat(STRING, file = file, append = append, sep = "\n")
}
+