在函数中使用 glue_data() 适用于某些列名而不适用于其他列名

Using glue_data() in a function works with some column names and not others

我正在开发一个函数,它将数据框和用户指定的列作为输入并使用 glue_data() 输出一些格式良好的文本。

一个变量是否有效似乎是运气,但每次尝试都是一致的。例如使用 mtcars,mpg 始终有效,而 hp 永远不会:

library(glue)
data <- head(mtcars)

print_messages <- function(x=NULL, att1=NULL, att2=NULL) {
  
  # This if-else seems to be the problem
  if(is.null(att1)) {
    att1_glue <- ""
  } else {
    att1_glue <- paste0("{", deparse(substitute(att1)),"}")
  }
  
  if(is.null(att2)) {
    att2_glue <- ""
  } else {
    att2_glue <- paste0("{", deparse(substitute(att2)),"}")
  }
  
  pattern <-   paste("", att1_glue,"", att2_glue)        
  
  glue_data(x, pattern)
  
}

print_messages(data, att1=mpg, att2=NULL) 

# 21  
# 21  
# 22.8  
# 21.4  
# 18.7  
# 18.1  

print_messages(data, att1=mpg, att2=hp)
#> Error in print_messages(data, att1 = mpg, att2 = hp): object 'hp' not found

这不是 att1att2

中哪个变量的函数

我发现问题出在 if-else 上,但不知道如何解决。它被插入是因为我不能只有一个空参数——这使得 glue_data() return 成为一个 0 字符的字符串:

print_messages <- function(x=NULL,att1=NULL, att2=NULL) {
  
  att1_glue <- paste0("{", deparse(substitute(att1)),"}")
  att2_glue <- paste0("{", deparse(substitute(att2)),"}")
  
  pattern <-   paste("",att1_glue,"", att2_glue)        
  
  glue_data(x, pattern)
  
}


print_messages(data, att1=mpg, att2=hp )
# 21  110
# 21  110
# 22.8  93
# 21.4  110
# 18.7  175
# 18.1  105

print_messages(data, att1=hp, att2=NULL )


我尝试了其他方法来使用 glue_data() 中函数的参数,例如 this answer. 但核心问题似乎与 if-else 有关。

我想知道那里发生了什么?即使有一种方法可以在 glue 方面解决此问题,我也会对为什么解析适用于某些列而不适用于其他列感兴趣!

感谢您的帮助!

计算 non-existing 个对象将引发错误。

f <- function(x = NULL) if(is.null(x)) cat("hi") else cat("bye")
f(mpg) # error
f("mpg")
#> bye
f()
#> hi

第一个函数应该抛出错误,您的环境中是否有一个名为 mpg 的对象?在那种情况下,词法作用域会找到它,并产生 is.null(mpg) as FALSE.

另一种方法是使用点 ...,并使用 paste 矢量化 性质,避免使用 pre-filled 参数NULL.

print_messages <- function(data, ...){
  expr = paste0("{", 
                vapply(substitute(...()), deparse, "")
                , "}", collapse = " ")
  glue_data(data, expr)
}