gpt4 book ai didi

R 在 glue 语句中使用 bang-bang

转载 作者:行者123 更新时间:2023-12-04 02:29:55 26 4
gpt4 key购买 nike

我想做一个简单的函数,它接受一个数据框和用户为该数据框中的两列提供的名称。目的是让它可以轻松地与 dplyr 管道一起工作。它将产生一个粘合字符串的字符向量:

func <- function(data, last, first) {
last <- rlang::enquo(last)
first <- rlang::enquo(first)

glue::glue_data(data, "{!!last}, {!!first}")
}

理想情况下,我希望用户能够调用:

df %>% func(lastName, firstName)

这将生成一个包含多个值的字符向量,格式为 Smith, John

我的函数目前不起作用,因为 bang-bang 运算符在 glue_data 的上下文中不起作用。我如何在仍然使用 NSE 的同时解决这个问题?我收到的错误是:

错误:Quosures 只能在准引用上下文中不被引用。

代表:

df <- data.frame(lastName = c("Smith", "Bond", "Trump"), firstName = c("John","James","Donald"))

> df
lastName firstName
1 Smith John
2 Bond James
3 Trump Donald

预期输出

> glue::glue_data(df, "{lastName}, {firstName}")

Smith, John
Bond, James
Trump, Donald

但是,我希望能够通过使用我的函数并调用来实现预期的输出:

df %>% func(lastName, firstName)

以上是我实际用例的简化版本,我实际上将调用 glue 语句作为后续函数中的参数:

biggerfn <- function(data, subject, first, last) {
subject <- rlang::enquo(subject)
first <- rlang::enquo(first)
last <- rlang::enquo(last)

data %>%
dplyr::distinct(!!subject, !!first, !!last) %>%
smallerfunc(!!subject, glue::glue_data(data, "{!!last}, {!!first}"))
}

最佳答案

我不知道您是否致力于 glue,但这可以使用 tidyr::unite 轻松完成:

func <- function(data, last, first) {
data %>%
tidyr::unite(result, {{last}}, {{first}}, sep=", ")
}

df %>% func(lastName, firstName)
# result
# 1 Smith, John
# 2 Bond, James
# 3 Trump, Donald

# Optionally, follow up with:
# %>% dplyr::pull(result)
# to retrieve the column

这里,{{x}}!!enquo(x) 的简写。

关于R 在 glue 语句中使用 bang-bang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64887735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com