при передаче df $ var в функцию, возможно ли получить имя 'var'? - PullRequest
0 голосов
/ 19 декабря 2018

Я пишу функцию, в которой я хотел бы иметь возможность передавать переменные из фрейма данных в виде атомарных векторов, например 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 голосов
/ 19 декабря 2018

Мы можем использовать 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 отметил в комментарияхлучше передавать имена столбцов и данные как отдельные аргументы.Если ограничение функции состоит в том, чтобы передавать только один аргумент, и оно всегда должно быть с $, то вышеупомянутая функция сможет извлечь имя столбца

...