将引用和格式拼接成字符串列表

3
dplyr::left_join(以及其他函数)中的by参数需要一个字符串列表。我的代码已经将感兴趣的变量定义为quo表达式列表,因此我想通过将quo表达式列表转换为字符串列表来避免第二次编写列表。我查找了rlang文档,但没有找到现有的解决方案。 quo_expr系列函数可以拼接并将quo表达式转换为单个字符串,但它们不会产生字符串列表:
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")) 
1个回答

3
我想到的解决方案是将 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)

这段内容非常简短,我可能会将其内联使用,而不是作为自定义函数。


我认为您的 quos_text 函数可以简化为 sapply(qs, quo_text) - Marius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接