R Shiny使用mutate触发max无有效参数返回-Inf警告问题
警告触发原因
- 核心原因是R的向量化逻辑运算不会短路执行:你代码中使用的
&是向量化逻辑运算符,R会先完整计算运算符两侧的所有表达式,再逐元素做与运算。当你筛选到My_Key1这类全量RSEXCL都为N的Key时,which(RSEXCL == 'Y')会返回空向量,哪怕左侧'Y' %in% RSEXCL已经为FALSE,右侧max(which(RSEXCL == 'Y'))仍然会执行,对空向量取max就会触发你看到的警告。 - 你尝试的
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
相关产品推荐
相关产品推荐

