@@ -666,47 +666,59 @@ RenumberTips.multiPhylo <- function(tree, tipOrder) {
666666 at <- attributes(tree )
667667 labelled <- ! is.null(at [[" TipLabel" ]])
668668
669- startOrder <- if (labelled ) at [[" TipLabel" ]] else tree [[1L ]][[" tip.label" ]]
669+ if (! labelled ) {
670+ # Unlabelled: each tree may have different tip orderings,
671+ # so must process individually
672+ tree <- lapply(tree , RenumberTips.phylo , tipOrder )
673+ attributes(tree ) <- at
674+ return (tree )
675+ }
676+
677+ startOrder <- at [[" TipLabel" ]]
670678 newOrder <- if (is.numeric(tipOrder )) {
671679 startOrder [tipOrder ]
672680 } else {
673681 TipLabels(tipOrder , single = TRUE )
674682 }
675683
676- if (identical(startOrder , newOrder )) return (tree )
677-
678- if (any(duplicated(newOrder ))) {
679- stop(" Tree labels " ,
680- paste0(newOrder [duplicated(newOrder )], collapse = " , " ),
681- " repeated in `tipOrder`" )
682- }
684+ nTip <- length(startOrder )
685+ if (identical(startOrder , newOrder )) {
686+ # Tip numbering already correct; use identity permutation to ensure
687+ # each tree materializes its own tip.label element
688+ matchOrder <- seq_len(nTip )
689+ } else {
690+ if (any(duplicated(newOrder ))) {
691+ stop(" Tree labels " ,
692+ paste0(newOrder [duplicated(newOrder )], collapse = " , " ),
693+ " repeated in `tipOrder`" )
694+ }
683695
684- if (length(startOrder ) != length(newOrder )) {
685- startOnly <- setdiff(startOrder , newOrder )
686- newOnly <- setdiff(newOrder , startOrder )
687- if (length(startOnly )) {
688- stop(" Tree labels and tipOrder must match." ,
689- if (length(newOnly )) " \n Missing in `tree`: " ,
690- paste0(newOnly , collapse = " , " ),
691- if (length(startOnly )) " \n Missing in `tipOrder`: " ,
692- paste0(startOnly , collapse = " , " )
693- )
696+ if (length(startOrder ) != length(newOrder )) {
697+ startOnly <- setdiff(startOrder , newOrder )
698+ newOnly <- setdiff(newOrder , startOrder )
699+ if (length(startOnly )) {
700+ stop(" Tree labels and tipOrder must match." ,
701+ if (length(newOnly )) " \n Missing in `tree`: " ,
702+ paste0(newOnly , collapse = " , " ),
703+ if (length(startOnly )) " \n Missing in `tipOrder`: " ,
704+ paste0(startOnly , collapse = " , " )
705+ )
706+ }
707+ newOrder <- intersect(newOrder , startOrder )
694708 }
695- newOrder <- intersect(newOrder , startOrder )
696- }
697709
698- nTip <- length (startOrder )
699- matchOrder <- match( startOrder , newOrder )
700- if (any(is.na( matchOrder ))) {
701- stop( " Tree labels " ,
702- paste0( startOrder [is.na( matchOrder )], collapse = " , " ),
703- " missing from `tipOrder` " )
710+ matchOrder <- match (startOrder , newOrder )
711+ if (any(is.na( matchOrder ))) {
712+ stop( " Tree labels " ,
713+ paste0( startOrder [is.na( matchOrder )], collapse = " , " ) ,
714+ " missing from `tipOrder` " )
715+ }
704716 }
705717
706718 tree <- .Call(`_TreeTools_renumber_tips_batch` , tree , matchOrder , nTip ,
707719 newOrder )
708720
709- if ( labelled ) at [[" TipLabel" ]] <- newOrder
721+ at [[" TipLabel" ]] <- newOrder
710722 attributes(tree ) <- at
711723 tree
712724}
0 commit comments