调用自定义R函数时出现“No non-missing arguments to max; returning -Inf”警告的原因?
问题原因及修复方案
你的函数出错的核心原因是没有正确引用传入的列名参数:原函数中直接写df$df_col_1时,R会把df_col_1当作字面量的列名(即找数据框里叫"df_col_1"的列),但你的数据框里只有col_1和col_2,所以df$df_col_1返回NULL,后续的which.max和max操作自然无法得到正确值,最终输出全为-Inf。
修复后的函数(基础R版本)
MaxLines <- function(df, df_col_1, df_col_2){ # 将传入的列参数转为字符形式的列名 col1_name <- as.character(substitute(df_col_1)) col2_name <- as.character(substitute(df_col_2)) # 获取col2的最大值及对应的col1值 max_col2 <- max(df[[col2_name]]) col1_at_max_col2 <- df[[col1_name]][which.max(df[[col2_name]])] # 构造结果数据框,保留原列名 data.frame( !!col1_name := c(rep(col1_at_max_col2, 2), -Inf), !!col2_name := c(-Inf, rep(max_col2, 2)) ) }
修复后的函数(非标准求值版本,需rlang包)
如果你习惯使用tidyverse风格的语法,可以用{{}}(curly-curly)简化代码:
library(rlang) MaxLines <- function(df, df_col_1, df_col_2){ max_col2 <- max({{df_col_2}}) col1_at_max_col2 <- {{df_col_1}}[which.max({{df_col_2}})] data.frame( !!ensym(df_col_1) := c(rep(col1_at_max_col2, 2), -Inf), !!ensym(df_col_2) := c(-Inf, rep(max_col2, 2)) ) }
测试验证
用你提供的测试代码调用修复后的函数:
col_1 = c(5,6,7) col_2 = c(1,2,3) foo <- data.frame(col_1,col_2) MaxLines(foo,col_1,col_2)
会得到预期输出:
col_1 col_2 1 7 -Inf 2 7 3 3 -Inf 3
内容的提问来源于stack exchange,提问作者Fish_Person
相关产品推荐
相关产品推荐

