在函数中使用 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
这不是 att1
与 att2
中哪个变量的函数
我发现问题出在 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)
}
我正在开发一个函数,它将数据框和用户指定的列作为输入并使用 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 上,但不知道如何解决。它被插入是因为我不能只有一个空参数——这使得 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)
}