为什么我需要包装函数在传递给tidyr ...参数时将字符向量返回到c()?

时间:2018-04-13 07:49:07

标签: r tidyr tidyverse nse

参见示例:

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有关但究竟是什么?

1 个答案:

答案 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>