将列作为字符对象输入时,如何使用tidyverse select?

时间:2019-06-03 07:37:00

标签: r dplyr tidyeval

我正在尝试创建一个函数,该函数根据函数的输入来选择列:

f <- function(string) {
  quosure <- quo(!!sym(string))
  dplyr::select(data, !!quosure)
}
temp <- f("id") # returns " Error in !quosure : invalid argument type"

奇怪的是,看起来非常相似的代码似乎起作用。

g <- function(string) {
  quosure <- quo(!!sym(string))
  dplyr::pull(data, !!quosure)
}
temp <- g("id") # Works fine

第一个功能和第二个功能有什么区别,这意味着第一个功能失败而第二个功能正常?

1 个答案:

答案 0 :(得分:0)

使用dplyr版本“ 0.8.0.1”对我来说效果很好。

library(dplyr)
packageVersion("dplyr")
'0.8.0.1'

data <- data.frame(id= 1:10, othervariable= 11:20)
f <- function(string) {
  quosure <- quo(!!sym(string))
  dplyr::select(data, !!quosure)
}
temp <- f("id")
temp
id
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10

如果您需要从一个数据帧中选择一个(多个)带有字符向量的列,我宁愿这样做

df <- data.frame(id= 1:10, othervariable= 11:20, x= 21:30)
f <- function(data, string) {
  data[ , string]
}
temp <- f(data= df, string= c("id", "x"))
temp
   id  x
1   1 21
2   2 22
3   3 23
4   4 24
5   5 25
6   6 26
7   7 27
8   8 28
9   9 29
10 10 30