R shinydashboard筛选padj值时丢失极小数值问题求助
问题根因
pickerInput组件默认返回的选择值为字符类型,你在筛选时直接用数值型的padj和字符型的input$FDR做比较,R会隐式将两边都转为字符串按字典序排序,导致极小的科学计数法表示的padj值被判定为大于阈值,被错误过滤。
示例验证:
# 字符串比较时极小值反而判定为更大 "1.41e-14" < "1" # 返回 FALSE # 转成数值比较才符合预期 as.numeric("1.41e-14") < 1 # 返回 TRUE
另外也可能存在读取csv时padj列被错误识别为字符类型的问题。
解决方案
按以下步骤修改代码即可:
1. 读取数据时强制转换padj为数值类型
修改读数据的代码,避免csv的格式问题导致padj为字符型,同时过滤无效的NA值:
DEG2 <- read.csv("DEG2.csv") DEG2 <- DEG2 %>% dplyr::mutate(padj = as.numeric(padj)) %>% dplyr::filter(!is.na(padj))
2. 筛选逻辑里强制转换输入阈值为数值
修改genes1的reactive逻辑,统一输入阈值的数据类型:
genes1 <- reactive({ fdr_threshold <- as.numeric(input$FDR) fc_threshold <- as.numeric(input$FC) genes <- DEG2 %>% dplyr::filter(padj <= fdr_threshold) %>% dplyr::filter(log2FoldChange >= fc_threshold | log2FoldChange <= -fc_threshold) })
可选优化
如果想从源头避免类型转换的问题,也可以在pickerInput定义时显式指定返回数值:
pickerInput("FDR", "False Discovery Rate", choices = c("1" = 1, "0.1" = 0.1, "0.05" = 0.05, "0.01" = 0.01))
这样input$FDR默认就是数值类型,无需额外转换。
内容的提问来源于stack exchange,提问作者willdesi
相关产品推荐
相关产品推荐

