You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:06:03