将df $ var传递给函数时,是否可以获取'var'的名称?

时间:2018-12-19 06:46:34

标签: r nse

我正在编写一个函数,希望能够将数据帧中的变量作为原子向量传递,例如df$var(例如mtcars$mpg)。

为使示例非常简单,请说该函数仅返回data.frame(table(df$var))

foo.function <- function(var) {
  data.frame(table(var))
}

head(foo.function(mtcars$mpg))
#>    var Freq
#> 1 10.4    2
#> 2 13.3    1
#> 3 14.3    1
#> 4 14.7    1
#> 5   15    1
#> 6 15.2    2

请注意,返回表中的列表变量的名称是传递对象的内部名称(var,而不是mpg的“原始”名称。是否可以从函数内检索mpg(仅是名称)(无需更改或添加参数)?我倾向于说不,因为R只是接收值的向量,但是我怀疑R可能具有基于NSE的能力。

1 个答案:

答案 0 :(得分:4)

我们可以使用deparse/substitute提取列名

foo.function <- function(var) {
   print(sub(".*\\$", "", deparse(substitute(var))))
   data.frame(table(var))
  }

head(foo.function(mtcars$mpg), 4)
#[1] "mpg"
#   var Freq
#1 10.4    2
#2 13.3    1
#3 14.3    1
#4 14.7    1

如果我们需要更改列名

foo.function <- function(var) {
  nm1 <- sub(".*\\$", "", deparse(substitute(var)))
  out <- data.frame(table(var))
  names(out)[1] <- nm1
  out
 }

head(foo.function(mtcars$mpg), 4)
#  mpg Freq
#1 10.4    2
#2 13.3    1
#3 14.3    1
#4 14.7    1

正如@RonakShah在注释中指出的,最好将列名和数据作为单独的参数传递。如果该函数的局限性是仅传递单个参数,并且始终必须使用$,则上述函数将能够检索列名