将一个 quosure 和 format 拼接成一个字符串列表
Splice a quosure and format into a list of strings
dplyr::left_join
(和朋友)中的 by
参数需要一个字符串列表。我的代码已经将感兴趣的变量定义为一个 quosures 列表,所以我想通过将 quosures 列表转换为字符串列表来避免第二次写下该列表。
我四处寻找 rlang
文档,但没有找到现有的解决方案。 quo_expr
系列函数可以将 quosures 拼接并转换为单个字符串,但它们不会生成字符串列表:
library(rlang)
# this works
sepal_length <- quo(Sepal.Length)
quo_text(sepal_length)
# this doesnt
sepaldims <- quos(Species, Sepal.Length)
quo_text(sepaldims)
这是一个有用的示例:
library(dplyr)
# group_by accepts a list of quosures
sepaldims <- quos(Species, Sepal.Length)
iris_sepal <- iris %>%
group_by(!!!sepaldims) %>%
summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))
petaldims <- quos(!!!sepaldims, Petal.Length)
iris_petal <- iris %>%
group_by(!!!petaldims) %>%
summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))
# but left join expects a list of strings
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length"))
我提出的解决方案适用于 quo_text
列表:
quos_text <- function(qs) {
unlist(lapply(seq_along(qs), function(i) quo_text(qs[[i]])))
}
现在我们可以处理quosures列表了:
sepaldims <- quos(Species, Sepal.Length)
petaldims <- quos(!!!sepaldims, Petal.Length)
quos_text(sepaldims)
quos_text(petaldims)
quos_text(quos(!!!sepaldims, Petal.Width))
并且left_join
满足:
# these two are equivalent
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length"))
iris_merge2 <- left_join(iris_sepal, iris_petal, by = quos_text(sepaldims))
@Marius 指出我们可以使用更简单的形式:
sapply(qs, quo_text)
这足够短,我可能会内联使用它而不是将其作为自定义函数。
dplyr::left_join
(和朋友)中的 by
参数需要一个字符串列表。我的代码已经将感兴趣的变量定义为一个 quosures 列表,所以我想通过将 quosures 列表转换为字符串列表来避免第二次写下该列表。
我四处寻找 rlang
文档,但没有找到现有的解决方案。 quo_expr
系列函数可以将 quosures 拼接并转换为单个字符串,但它们不会生成字符串列表:
library(rlang)
# this works
sepal_length <- quo(Sepal.Length)
quo_text(sepal_length)
# this doesnt
sepaldims <- quos(Species, Sepal.Length)
quo_text(sepaldims)
这是一个有用的示例:
library(dplyr)
# group_by accepts a list of quosures
sepaldims <- quos(Species, Sepal.Length)
iris_sepal <- iris %>%
group_by(!!!sepaldims) %>%
summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))
petaldims <- quos(!!!sepaldims, Petal.Length)
iris_petal <- iris %>%
group_by(!!!petaldims) %>%
summarize(sepal_width = mean(Sepal.Width), petal_width = mean(Petal.Width))
# but left join expects a list of strings
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length"))
我提出的解决方案适用于 quo_text
列表:
quos_text <- function(qs) {
unlist(lapply(seq_along(qs), function(i) quo_text(qs[[i]])))
}
现在我们可以处理quosures列表了:
sepaldims <- quos(Species, Sepal.Length)
petaldims <- quos(!!!sepaldims, Petal.Length)
quos_text(sepaldims)
quos_text(petaldims)
quos_text(quos(!!!sepaldims, Petal.Width))
并且left_join
满足:
# these two are equivalent
iris_merge <- left_join(iris_sepal, iris_petal, by = c("Species", "Sepal.Length"))
iris_merge2 <- left_join(iris_sepal, iris_petal, by = quos_text(sepaldims))
@Marius 指出我们可以使用更简单的形式:
sapply(qs, quo_text)
这足够短,我可能会内联使用它而不是将其作为自定义函数。