brushPoints RShiny - dsplay выбранные подсказки из дерева филогенети c - PullRequest
0 голосов
/ 23 января 2020

Я хотел бы загрузить филогенетическое дерево c через RShiny и использовать функцию brushPoints, чтобы пользователь мог выбрать подсказки из дерева филогеники c. В конечном итоге выбранные советы будут использоваться в качестве информации для обновления дерева с помощью аннотации. Я хотел показать подсказки, которые выбраны для подтверждения выбора, но я не могу сгенерировать verbatiumTextOutput. Предложения

Ниже моя попытка:

library(shiny)
library(ggplot2)
library(treeio)
library(ggtree)
library(tidytree) 

tree <- treeio::read.newick("1509MLJF6-1.dnd")

# Define UI for application that draws a histogram
ui <- fluidPage(

  # Application title
  titlePanel("Select Individuals and Display Data"),

  # Show a plot and output table 
  mainPanel(
    plotOutput("treeDisplay", brush = "plot_brush"),
    verbatimTextOutput("selectedIndivs")

  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {
  output$treeDisplay <- renderPlot({
    ggplot(tree) + geom_tree() + geom_tiplab()
  })

  output$selectedIndivs <- renderPrint({
    brushedPoints(tree, input$plot_brush)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

При запуске приложения ошибка: Предупреждение: Ошибка в [: неверное количество измерений

и при выборе отдельных лиц ошибка: Ошибка в представлении: недопустимый аргумент 'times'

При необходимости дерево phylogeneti c находится здесь :

1 Ответ

1 голос
/ 24 января 2020

ape заход на посадку

Чтобы получить подсказки пользователя, необходимо знать координаты x и y внутреннего и конечного узлов на графике. Вы можете получить их, используя пакет ape. Затем, когда у вас есть координаты очищаемой области, вы можете установить в таблицу координат филоса только очищенные кончики. В приведенном ниже примере мы должны явно указать brushedPoints, где искать координаты x и y (столбцы xvar и yvar во фрейме данных). В зависимости от количества видов на дереве, вам может потребоваться расширить область заговора, чтобы избежать наложения, чтобы можно было легко расчесывать виды.


Код:

library(shiny)
library(ape)

Tree <- rtree(n=20)
Tree <- ladderize(Tree)

ui <- basicPage(
  plotOutput("plot1", brush = "plot_brush"),
  tableOutput("brushed_subtree")
)

server <- function(input, output) {

  output$plot1 <- renderPlot({
    plot(Tree)
  })

  getTreeInfo <- reactive({
    plot(Tree)
    plotinfo <- get("last_plot.phylo", envir = .PlotPhyloEnv)
    tips_xy <- data.frame(Tip=Tree$tip.label, 
                          xvar=plotinfo$xx[1:Ntip(Tree)], 
                          yvar=plotinfo$yy[1:Ntip(Tree)])
    return(tips_xy)
  })

  # render selected tips table 
  output$brushed_subtree <- renderTable({
    brushedPoints(getTreeInfo(), input$plot_brush, xvar = "xvar", yvar = "yvar")
  })

}

shinyApp(ui, server)

Gif: enter image description here


ggtree заход на посадку

Подход на ggtree проще. Фактически, вы уже были близки, за исключением того, что вместо передачи дерева на brushedPoints вам нужно предоставить компонент $data графика ggtree. Обратите внимание, что в этом случае зачищенная область должна включать в себя конечную ветвь искомого наконечника, поскольку координаты графика задаются фреймом данных ребер, а наконечники представляют собой отдельный геом, нанесенный на график относительно ранее нанесенных (терминальных) ребер .


Код

library(shiny)
library(ggplot2)
library(treeio)
library(ggtree)
library(tidytree) 

tree <- treeio::read.newick("1509MLJF6-1.dnd")
treedt <- as.treedata(tree)

# Define UI for application that draws a histogram
ui <- fluidPage(

  # Application title
  titlePanel("Select Individuals and Display Data"),

  # Show a plot and output table 
  mainPanel(
    plotOutput("treeDisplay", brush = "plot_brush"),
    verbatimTextOutput("selectedIndivs")

  )
)

# Define server logic required to draw a histogram
server <- function(input, output) {

  make_tree <- reactive({
     ggplot(tree) + geom_tree() + geom_tiplab()
  })

  output$treeDisplay <- renderPlot({
    make_tree()
  })

  output$selectedIndivs <- renderPrint({
    brushedPoints(make_tree()$data, input$plot_brush)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

GIF:

enter image description here

...