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

R Shiny使用mutate触发max无有效参数返回-Inf警告问题

警告触发原因
  1. 核心原因是R的向量化逻辑运算不会短路执行:你代码中使用的&是向量化逻辑运算符,R会先完整计算运算符两侧的所有表达式,再逐元素做与运算。当你筛选到My_Key1这类全量RSEXCL都为N的Key时,which(RSEXCL == 'Y')会返回空向量,哪怕左侧'Y' %in% RSEXCL已经为FALSE,右侧max(which(RSEXCL == 'Y'))仍然会执行,对空向量取max就会触发你看到的警告。
  2. 你尝试的case_when写法也会触发警告的原因同理:case_when会预先计算所有分支的条件表达式,再逐行匹配符合的分支,空向量取max的操作依然会执行。
解决方法

你可以通过控制流提前判断、仅当存在Y时才计算最大索引的方式规避空向量取max的问题,同时可以简化原来的行索引判断逻辑,直接用row_number()获取当前行的局部索引:

server <- function(input, output, session){
    my.table <- reactive({
        req(input$series)
        outlier.DT.file %>% 
            filter(Key == input$series) %>% 
            mutate(
                # 仅当存在Y时计算最大索引,否则返回0
                max_y_idx = if ('Y' %in% RSEXCL) max(which(RSEXCL == 'Y')) else 0L,
                # 直接用行号对比判断赋值
                RSEXCL = ifelse(row_number() <= max_y_idx, "Y", "N")
            ) %>% 
            select(-max_y_idx) # 删除辅助计算列
    })
   output$table <- renderTable({my.table()})
}

上述代码中使用的if是标量控制流,只有当'Y' %in% RSEXCL返回TRUE时才会执行max(which(RSEXCL == 'Y')),完全规避了空向量取max的场景,警告会直接消失,同时逻辑完全符合你的需求。


内容的提问来源于stack exchange,提问作者LauraDR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:24:02