r-在函数中使用glue_data()可以处理某些列名,而不能处理其他列名



我正在开发一个函数,该函数将数据帧和用户指定的列作为输入,并使用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是问题所在,但不知道如何解决它。它被插入是因为我不能只有一个null参数——这使得glue_data()返回一个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()中函数的参数,比如这个答案。但核心问题似乎是"非此即彼"。

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

谢谢你的帮助!

对不存在的对象求值将引发错误。

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)作为FALSE

另一种选择是使用点...,并使用paste矢量化特性,避免了使用NULL预先填充参数的需要。

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

最新更新