blastCoverageAPP.R

# 加载必要的库
library(shiny)
library(dplyr)

# 定义UI
ui <- fluidPage(
  titlePanel("BLAST Query Coverage Calculator"),
  sidebarLayout(
    sidebarPanel(
      fileInput("blast_file", "上传BLAST结果 (CSV格式):", 
                accept = c(".csv")),
      fileInput("length_file", "上传Subject长度文件 (txt格式):", 
                accept = c(".txt")),
      actionButton("calculate", "计算覆盖率"),
      downloadButton("download_coverage", "下载覆盖率结果")
    ),
    mainPanel(
      tableOutput("coverage_table")
    )
  )
)

# 定义服务器逻辑
server <- function(input, output) {
  
  # 计算覆盖率
  observeEvent(input$calculate, {
    req(input$blast_file, input$length_file)
    
    # 读取BLAST结果
    blast_results <- read.csv(input$blast_file$datapath, header = FALSE)
    colnames(blast_results) <- c("query", "subject", "identity", "length", "mismatch", 
                                 "gapopen", "qstart", "qend", "sstart", "send", "evalue", "bitscore")
    
    # 读取subject长度信息
    subject_lengths <- read.table(input$length_file$datapath, header = TRUE)
    
    # 计算覆盖率
    coverage <- blast_results %>%
      mutate(query_length = qend - qstart + 1) %>%
      group_by(subject) %>%
      summarise(total_query_coverage = sum(query_length)) %>%
      left_join(subject_lengths, by = "subject") %>%
      mutate(coverage_ratio = (total_query_coverage / length) * 100, 
             coverage_ratio = round(coverage_ratio, 2)) %>%
      select(subject, total_query_coverage, length, coverage_ratio)
    
    # 保存结果到输出
    output$coverage_table <- renderTable({
      coverage
    })
    
    # 下载按钮的逻辑
    output$download_coverage <- downloadHandler(
      filename = function() {
        "coverage.txt"
      },
      content = function(file) {
        write.table(coverage, file, sep = "\t", row.names = FALSE, quote = FALSE)
      }
    )
  })
}

# 运行应用
shinyApp(ui = ui, server = server)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终是蝶衣梦晓楼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值