gpt4 book ai didi

r - 在用户定义的函数中使用胶水进行变异

转载 作者:行者123 更新时间:2023-12-04 14:05:36 26 4
gpt4 key购买 nike

我想使用 glue 更改特定列中的值以包含来自另一列的信息功能。
我通常这样做:

library(glue)
library(dplyr)
df = data.frame(x = c("Banana","Apple","Melon"),
y = c(10,15,27),
z = rep(c("something_else"),3))
df %>%
mutate(x = glue("{x} ({y})"))
输出:
#>             x  y              z
#> 1 Banana (10) 10 something_else
#> 2 Apple (15) 15 something_else
#> 3 Melon (27) 27 something_else
当我尝试使用数据框和列名作为用户定义函数中的输入来做同样的事情时,我的问题就出现了。
我最初的建议是使用双花括号和粘合函数来传递输入,但这会导致错误。
concatenate_value_to_string <- function(tbl,var1,var2) {
tbl %>%
mutate({{var1}} := glue("{{{var1}}} ({{{var2}}})"))
}

concatenate_value_to_string(df,x,y)
#> Error in UseMethod("mutate"): no applicable method for 'mutate' applied to an object of class "function"
创建于 2021-08-02 由 reprex package (v2.0.0)
显然三重花括号不是这里的解决方案,有人可以帮我吗?
谢谢你。

最佳答案

您可以使用 pull() :

concatenate_value_to_string <- function(tbl,var1,var2) {
tbl %>%
mutate({{var1}} := glue("{pull(., {{var1}})} ({pull(., {{var2}})})"))
}

concatenate_value_to_string(df,x,y)

concatenate_value_to_string(df,x,y)
#> x y z
#> 1 Banana (10) 10 something_else
#> 2 Apple (15) 15 something_else
#> 3 Melon (27) 27 something_else
eval(expr(...)) :
concatenate_value_to_string <- function(tbl,var1,var2) {
tbl %>%
mutate({{var1}} := glue("{eval(expr({{var1}}))} ({eval(expr({{var2}}))})"))
}

concatenate_value_to_string(df,x,y)
#> x y z
#> 1 Banana (10) 10 something_else
#> 2 Apple (15) 15 something_else
#> 3 Melon (27) 27 something_else
您尝试的方法无效,因为 mutate()不能替代 {{foo}}如果它是字符串的一部分,在上面的解决方案中, pull()expr()做吧。
我个人更愿意使用 sprintf()在这种情况下 :
concatenate_value_to_string <- function(tbl,var1,var2) {
tbl %>%
mutate({{var1}} := sprintf("%s (%s)", {{var1}}, {{var2}}))
}

concatenate_value_to_string(df,x,y)
#> x y z
#> 1 Banana (10) 10 something_else
#> 2 Apple (15) 15 something_else
#> 3 Melon (27) 27 something_else

关于r - 在用户定义的函数中使用胶水进行变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68623850/

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