参见示例:
df <- data.frame(month=rep(1:3,2),
student=rep(c("Amy", "Bob"), each=3),
A=c(9, 7, 6, 8, 6, 9),
B=c(6, 7, 8, 5, 6, 7))
cnames<-function(){c(month="month",student="student")}
将cnames()
打包到c()
时,对tidyr::gather
的调用有效:
df2 <- df %>%
gather(variable, value, -c(cnames()))
但是当我仅使用cnames()
或(cnames())
调用它时失败:
df2 <- df %>%
gather(variable, value, -(cnames()))
即
> df2 <- df %>%
+ gather(variable, value, -(cnames()))
Error in -(cnames()) : invalid argument to unary operator
我猜这与NSE有关但究竟是什么?
答案 0 :(得分:2)
我相信&#39;适当的&#39;在当前tidyverse
/ tidyselect
中执行此操作的方式是......
df %>% gather(variable, value, -(!! cnames()))
df %>% gather(variable, value, -c(cnames()))
之所以有效,是因为c()
在tidyselect
中的处理方式与平时不同。见string coercion affects c()
#37
df %>% gather(variable, value, -(cnames()))
不工作,因为整个表达式都会评估(包括-
),因此您会遇到与仅运行-(cnames())
<相同的错误/ p>