В приведенном ниже примере используется ggtree, в котором я могу почистить подсказки в филогении и добавить метку аннотации («клада»). Шаги для запуска приложения -
- загрузить дерево - называется vert.tree
- проведите кистью (выделите) подсказки (проверьте с человеком и лемуром) и нажмите кнопку «аннотировать дерево», чтобы добавить метку красного цвета.
Что я хочу сделать, так это добавить еще одну аннотацию к дереву, сохранив при этом первую аннотацию (человек и лемур). Например, вторая этикетка для подсказок свиньи и коровы. По сути, я хочу иметь возможность добавлять строку в филогенетическое дерево на основе ввода пользователя, а затем повторять это на основе второго ввода пользователя, сохраняя при этом первую строку на изображении. В настоящее время метка сбрасывается каждый раз, когда я чищу другую пару, поэтому за раз отображается только одна аннотация.
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
library(shiny)
library(treeio)
library(ggtree)
library(phytools)
library(ape)
#make phylogenetic tree
text.string <-"(((((((cow, pig),whale),(bat,(lemur,human))),(robin,iguana)),coelacanth),gold_fish),shark);"
#read in the tree
vert.tree<-ape::read.tree(text=text.string)
# Define UI for application that draws a histogram
ui <- fluidPage(
# Application title
titlePanel("Test"),
actionButton("add_annotation","Add clade annotation"),
# Show a plot of the generated distribution
mainPanel(plotOutput("treeDisplay", brush ="plot_brush")
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
#reactive that holds base tree - this is how I am building the base tree
make_tree <- reactive({
ggtree::ggtree(vert.tree)+
ggtree::geom_tiplab()+
ggplot2::xlim(NA, 10)})
#render base tree
output$treeDisplay <- renderPlot({
make_tree()
})
#reactive that holds the brushed points on a plot
dataWithSelection <- reactive({
brushedPoints(make_tree()$data, input$plot_brush)
})
#add to label to vector if isTip == True
dataWithSelection2 <- reactive({
tipVector <- c()
for (i in 1:length(dataWithSelection()$label)){ if(dataWithSelection()$isTip[i] == TRUE) tipVector <- c(tipVector,dataWithSelection()$label[i])}
return(tipVector)
})
# incorporate the tipVector information for adding layer
layer <- reactive({
ggtree::geom_cladelabel(node=phytools::findMRCA(ape::as.phylo(make_tree()), dataWithSelection2()), label = "Clade", color = "red")
})
#display that layer onto the tree
observeEvent(input$add_annotation, {
output$treeDisplay <- renderPlot({make_tree() + layer()})
})
}
# Run the application
shinyApp(ui = ui, server = server)
Предложения очень ценятся!
обновлено для включения базового дерева (vert.tree)
mtcars
илиiris
). - person bretauv   schedule 10.04.2020