R语言 是什么原因导致“没有非缺失参数到max;返回-Inf”?

cuxqih21  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(448)

我有一个函数可以在图上画出特定的线,定义为

MaxLines <- function(df,df_col_1,df_col_2){
  data.frame(df_col_1 = c(rep(df$df_col_1[which.max(df$df_col_2)], 2),
                                           -Inf), 
                       df_col_2 = c(-Inf, rep(max(df$df_col_2), 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)

------------------------------------------------
new_1 new_2
1  -Inf  -Inf
2  -Inf  -Inf
3  -Inf  -Inf
Warning message:
In max(df$df_col_2) : no non-missing arguments to max; returning -Inf

我希望函数返回
| 列_1|第二栏|
| - ------|- ------|
| 七|- 推断|
| 七|三个|
| - 推断|三个|
但它没有。当直接输入到函数即。

MaxLines <- data.frame(col_1 = c(rep(foo$col_1[which.max(foo$col_2)], 2),
                                           -Inf), 
                       col_2 = c(-Inf, rep(max(foo$col_2), 2)))

我得到了正确的输出,所以看起来只是函数的调用。

w1jd8yoj

w1jd8yoj1#

Base R函数不允许传入未加引号的列名。您可以将符号转换为字符串

MaxLines <- function(df,df_col_1,df_col_2){
  df_col_1<-as.character(substitute(df_col_1))
  df_col_2<-as.character(substitute(df_col_2))
  data.frame(df_col_1 = c(rep(df[[df_col_1]][which.max(df[[df_col_2]])], 2),
                          -Inf), 
             df_col_2 = c(-Inf, rep(max(df[[df_col_2]]), 2)))
  
}
MaxLines(foo,col_1,col_2)

也可以传入字符串

MaxLines <- function(df,df_col_1,df_col_2){
  data.frame(df_col_1 = c(rep(df[[df_col_1]][which.max(df[[df_col_2]])], 2),
                          -Inf), 
             df_col_2 = c(-Inf, rep(max(df[[df_col_2]]), 2)))
  
}
MaxLines(foo,"col_1","col_2")
ryevplcw

ryevplcw2#

另一种解决方案:你会重复列名和参数,所以如果你把函数改成这样,它就可以工作了:

MaxLines <- function(df,col1,col2){
  data.frame(df_col_1 = c(rep(df[[col1]][which.max(df[[col2]])], 2),
                          -Inf), 
             df_col_2 = c(-Inf, rep(max(df[[col2]]), 2)))
  
}

输出:

MaxLines(foo,'col_1','col_2')

# df_col_1 df_col_2
# 1        7     -Inf
# 2        7        3
# 3     -Inf        3

相关问题