我正在开发一个函数,该函数将数据帧和用户指定的列作为输入,并使用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
这不是att1
与att2
中哪个变量的函数
我已经知道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)
}