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

when passing df$var to a function, is it possible to get the name of 'var'?

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

为使示例非常简单,假设函数只是 returns 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

请注意,返回的 table 中表格变量的名称是传递对象的内部名称 (var) 而不是它的 "original" 名称,后者是 mpg。是否可以从函数中检索 mpg (只是名称)(无需更改或添加参数)?我倾向于说不,因为 R 只是接收一个值向量,但我怀疑 R 可能具有这种能力基于它可以用 NSE.

做什么

我们可以使用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 在评论中指出的那样,最好将列名和数据作为单独的参数传递。如果函数的限制是只传递一个参数并且它总是必须与 $ 在一起,那么上面的函数将能够检索列名