gpt4 book ai didi

r - - 使用非标准评估进行收集的运算符

转载 作者:行者123 更新时间:2023-12-05 00:49:46 24 4
gpt4 key购买 nike

我想编写一个以 quosure 作为参数的函数,附加 -到 quosure,并将其传递给 gather ,像这样:

library(tidyverse)
my_gather <- function(d, not.columns) {
dg <- tidyr::gather(d, key = k, value = v, .dots = -!!!not.columns)
dg
}

de <- my_gather(mtcars, not.columns = quos(mpg, cyl, disp))

> Error in `-`(~mpg, ~cyl, ~disp) : operator needs one or two arguments

这显然是因为我需要用 - 附加 quosure 的每个元素,而不是用 - 附加整个 quosure .但是在我的工作中,以 quos(-mpg, -cyl, -disp)的形式创建这个quosure并不容易。 - 那么我该如何修改 quos(mpg, cyl, disp)添加 - ?

我希望看到与 gather(mtcars, key = k, value = v, -mpg, -cyl, -disp) 相同的结果,其中前 3 行是
   mpg cyl disp  k   v
1 21.0 6 160 hp 110
2 21.0 6 160 hp 110
3 22.8 4 108 hp 93

有一个类似的问题 here ,但它没有得到答复,似乎没有处理 quos() 的问题。而不是 quo() .

最佳答案

我们可以做的

my_gather <- function(d, not.columns) {
tidyr::gather(d, key = k, value = v, .dots = -c(UQS(not.columns)))
#or use !!! instead of UQS
#tidyr::gather(d, key = k, value = v, .dots = -c(!!!(not.columns)))

}
de <- my_gather(mtcars, not.columns = quos(mpg, cyl, disp))
head(de, 3)
# mpg cyl disp k v
#1 21.0 6 160 hp 110
#2 21.0 6 160 hp 110
#3 22.8 4 108 hp 93

在没有函数的情况下检查输出
de1 <- gather(mtcars, key = k, value = v, -mpg, -cyl, -disp)
identical(de, de1)
#[1] TRUE

关于r - - 使用非标准评估进行收集的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47002033/

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