使用tidyeval tidyr排除而不包括聚集变量

使用tidyeval tidyr排除而不包括聚集变量,r,tidyr,tidyverse,tidyeval,R,Tidyr,Tidyverse,Tidyeval,如果我想排除某些列(Ozone,Day,Month),这些列被“收集”,我可以这样做: tidyr::gather(空气质量、关键字、值、-臭氧、-天、-月) 但在一个函数中,我不清楚如何做到这一点。这似乎很笨拙,尽管它可以工作: my_gather <- function(col_to_compare) { gather_cols = dplyr::setdiff(c("Ozone", "Solar.R","Wind","Temp"), col_to_compare) tidyr

如果我想排除某些列(
Ozone
Day
Month
),这些列被“收集”,我可以这样做:

tidyr::gather(空气质量、关键字、值、-臭氧、-天、-月)

但在一个函数中,我不清楚如何做到这一点。这似乎很笨拙,尽管它可以工作:

my_gather <- function(col_to_compare) {
  gather_cols = dplyr::setdiff(c("Ozone", "Solar.R","Wind","Temp"), col_to_compare)
  tidyr::gather(airquality, key, value, !! rlang::enquo(gather_cols))
}

my_gather("Ozone")
my_-gather由于
gather()
select()
具有相同的语义,因此此问题与之重复

您可以使用
-一个(变量)
,这是推荐的方法

或者,您可以构造一个否定符号列表,并在
gather()
调用中拼接这些表达式。下面是如何创建符号并将其包装在调用
-
中:

# This creates a list of symbols
syms <- syms(vars)

# This creates a list of calls:
exprs <- map(syms, function(sym) lang("-", sym))

是否要使用列名作为字符串的函数?如果是这样,您可能会发现
-one\u of(cols\u to\u compare)
很有用。是否希望将列作为类似
my\u collect(Ozone)
而不是
my\u collect(-Ozone)
的方式传递?我认为后一种方法相当简单,第一种方法会稍微复杂一些。aosmith是对的,这里的解决方案是
one\u of()
。而且你不应该以这种方式使用
enquo()
(在那种情况下它甚至不应该工作,我认为这是一个bug)
enquo()
用于捕获用户提供的参数,并将捕获的表达式包装到quosure中。这里不需要捕获,使用quosure也没有帮助。
df %>% gather(key, value, !!! exprs)