##' @importFrom tidytree MRCA ##' @method MRCA ggtree ##' @export MRCA.ggtree <- function(.data, .node1, .node2 = NULL, ...) { MRCA(.data$data, .node1, .node2 = .node2, ...)[["node"]] } ## ##' Find Most Recent Common Ancestor among a vector of tips ## ##' ## ##' ## ##' @title MRCA ## ##' @param obj supported tree object or ggplot object ## ##' @param tip a vector of mode numeric or character specifying the tips ## ##' @return MRCA of two or more tips ## ##' @importFrom ape getMRCA ## ##' @export ## ##' @author Guangchuang Yu ## MRCA <- function(obj, tip) { ## if (is(obj,"gg")) { ## return(getMRCA.df(obj$data, tip)) ## } ## getMRCA(as.phylo(obj), tip) ## } ## getMRCA.df <- function(data, tip) { ## if (length(tip) <= 1) ## return(NULL) ## anc <- getMRCA.df_internal(data, tip[1], tip[2]) ## if (length(tip) == 2) { ## return(anc) ## } ## for (i in 3:length(tip)) { ## anc <- getMRCA.df_internal(data, tip[i], anc) ## } ## return(anc) ## } ## getMRCA.df_internal <- function(data, node1, node2) { ## node1 <- which(node1 == data$label | node1 == data[, "node"]) ## node2 <- which(node2 == data$label | node2 == data[, "node"]) ## anc1 <- getAncestor.df(data, node1) ## anc2 <- getAncestor.df(data, node2) ## if (length(anc1) == 0L) { ## warning("getMRCA.df_internal(): node1 is root") ## } ## if (length(anc2) == 0L) { ## warning("getMRCA.df_internal(): node2 is root") ## } ## # Return common ancestors. ## intersect(c(node1, anc1), c(node2, anc2))[1] ## }