# 加载必要的库
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)
09-24
237
09-24
607