我想编写一个函数,将 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/

10-11 08:51