Yuanclaw / archive /tests /test_fix_validation.R
huashu's picture
Export YuanSeq to Hugging Face without binary assets
7e6a9d1
Raw
History Blame Contribute Delete
5.81 kB
# 测试修复后的KEGG/GO分析代码
library(AnnotationDbi)
# 测试清理基因符号函数
test_clean_gene_symbols <- function() {
cat("=== 测试清理基因符号函数 ===\n")
# 测试数据
test_genes <- c(
"TP53", "tp53", "TP53 ", "TP-53", "TP53.1", "TP53-ps",
"Trp53", "trp53", "Trp53 ", "Trp-53", "Trp53.2", "Trp53-rs",
"ENSG00000141510", "ENSMUSG00000059552", "12345", "gene1"
)
cat("原始基因符号:\n")
print(test_genes)
# 测试人类基因清理
cat("\n--- 人类基因清理结果 ---\n")
human_cleaned <- sapply(test_genes, function(gene) {
# 模拟clean_gene_symbols函数逻辑
cleaned <- trimws(gene)
cleaned <- gsub("[\t\n\r]", "", cleaned)
cleaned <- gsub("\\.[0-9]+$", "", cleaned)
cleaned <- gsub("-ps$", "", cleaned, ignore.case = TRUE)
cleaned <- gsub("-rs$", "", cleaned, ignore.case = TRUE)
cleaned <- gsub("-as$", "", cleaned, ignore.case = TRUE)
cleaned <- toupper(cleaned)
cleaned <- gsub("[^[:alnum:]]", "", cleaned)
return(cleaned)
})
print(human_cleaned)
# 测试小鼠基因清理
cat("\n--- 小鼠基因清理结果 ---\n")
mouse_cleaned <- sapply(test_genes, function(gene) {
# 模拟clean_gene_symbols函数逻辑
cleaned <- trimws(gene)
cleaned <- gsub("[\t\n\r]", "", cleaned)
cleaned <- gsub("\\.[0-9]+$", "", cleaned)
cleaned <- gsub("-ps$", "", cleaned, ignore.case = TRUE)
cleaned <- gsub("-rs$", "", cleaned, ignore.case = TRUE)
cleaned <- gsub("-as$", "", cleaned, ignore.case = TRUE)
# 小鼠基因:首字母大写,其余小写
if (grepl("^[A-Za-z]", cleaned)) {
cleaned <- paste0(toupper(substr(cleaned, 1, 1)), tolower(substr(cleaned, 2, nchar(cleaned))))
}
cleaned <- gsub("[^[:alnum:]]", "", cleaned)
return(cleaned)
})
print(mouse_cleaned)
}
# 测试智能转换函数逻辑
test_smart_conversion_logic <- function() {
cat("\n=== 测试智能转换函数逻辑 ===\n")
# 模拟smart_gene_conversion函数的逻辑
simulate_smart_conversion <- function(gene_ids, keytypes_to_try = c("SYMBOL", "ALIAS", "ENSEMBL", "ENTREZID")) {
cat("输入基因ID:", paste(gene_ids, collapse=", "), "\n")
for (keytype in keytypes_to_try) {
cat("\n尝试keytype:", keytype, "\n")
# 模拟数据库查询
if (keytype == "SYMBOL") {
# 假设数据库中存在的SYMBOL
valid_symbols <- c("TP53", "BRCA1", "EGFR", "MYC", "ACTB", "GAPDH")
matched <- gene_ids[gene_ids %in% valid_symbols]
if (length(matched) > 0) {
cat(" 匹配到", length(matched), "个基因:", paste(matched, collapse=", "), "\n")
return(list(
converted = matched,
keytype_used = keytype,
matched_count = length(matched),
success_count = length(matched)
))
}
} else if (keytype == "ENSEMBL") {
# 假设数据库中存在的ENSEMBL ID
valid_ensembl <- c("ENSG00000141510", "ENSG00000012048", "ENSG00000146648")
matched <- gene_ids[gene_ids %in% valid_ensembl]
if (length(matched) > 0) {
cat(" 匹配到", length(matched), "个ENSEMBL ID:", paste(matched, collapse=", "), "\n")
return(list(
converted = matched,
keytype_used = keytype,
matched_count = length(matched),
success_count = length(matched)
))
}
}
}
cat("\n所有keytype尝试都失败了\n")
return(NULL)
}
# 测试不同ID类型的基因
test_cases <- list(
c("TP53", "BRCA1", "NOT_A_GENE"),
c("ENSG00000141510", "ENSG00000012048", "INVALID_ID"),
c("TP53", "ENSG00000141510", "12345")
)
for (i in seq_along(test_cases)) {
cat("\n--- 测试用例", i, "---\n")
result <- simulate_smart_conversion(test_cases[[i]])
if (!is.null(result)) {
cat("转换成功! 使用的keytype:", result$keytype_used, "\n")
cat("成功转换的基因:", paste(result$converted, collapse=", "), "\n")
}
}
}
# 测试错误处理
test_error_handling <- function() {
cat("\n=== 测试错误处理逻辑 ===\n")
# 模拟mapIds可能出现的错误
simulate_mapIds_error <- function(keys, keytype) {
if (keytype == "SYMBOL" && any(!keys %in% c("TP53", "BRCA1", "EGFR"))) {
stop("None of the keys entered are valid keys for 'SYMBOL'")
}
return(keys)
}
# 测试错误情况
test_keys <- c("TP53", "INVALID_GENE", "BRCA1")
cat("测试基因:", paste(test_keys, collapse=", "), "\n")
tryCatch({
result <- simulate_mapIds_error(test_keys, "SYMBOL")
cat("mapIds成功:", paste(result, collapse=", "), "\n")
}, error = function(e) {
cat("mapIds错误:", e$message, "\n")
cat("这是预期的错误,我们的修复应该能处理这种情况\n")
})
}
# 运行所有测试
cat("开始验证修复后的代码...\n")
test_clean_gene_symbols()
test_smart_conversion_logic()
test_error_handling()
cat("\n=== 修复总结 ===\n")
cat("1. 改进了基因符号清理函数:\n")
cat(" - 去除版本号(.1, .2等)\n")
cat(" - 去除假基因后缀(-ps, -rs, -as)\n")
cat(" - 标准化大小写(人类:大写,小鼠:首字母大写)\n")
cat(" - 去除特殊字符\n")
cat("\n2. 添加了智能基因符号转换函数:\n")
cat(" - 自动尝试不同的keytype(SYMBOL, ALIAS, ENSEMBL, ENTREZID)\n")
cat(" - 先验证基因ID是否在当前keytype中有效\n")
cat(" - 提供详细的转换统计信息\n")
cat("\n3. 改进了错误处理:\n")
cat(" - 当直接使用SYMBOL keytype失败时,会尝试其他keytype\n")
cat(" - 提供更详细的错误信息和用户反馈\n")
cat("\n这些修复应该能彻底解决'None of the keys entered are valid keys for SYMBOL'错误。\n")