Получить имена аргументов функции R

Для произвольной функции

f <- function(x, y = 3){
  z <- x + y
  z^2
}

Я хочу иметь возможность принимать имена аргументов f

> argument_names(f)
[1] "x" "y"

Это возможно?


person landau    schedule 16.11.2016    source источник
comment
Проверьте ?formals   -  person Dason    schedule 16.11.2016
comment
Потрясающий! Оба работают. Не стесняйтесь отвечать. Я приму первое.   -  person landau    schedule 16.11.2016
comment
help(args) или одна из связанных там функций.   -  person Roland    schedule 16.11.2016
comment
@landau О, привет, я тебя знаю. Маленький мир.   -  person Dason    schedule 16.11.2016
comment
Да, @Dason, я помню тебя с аспирантуры. Как насчет этого? Чжэюань Ли отказался от возможности претендовать на лучший ответ. Хотите несколько простых моментов?   -  person landau    schedule 16.11.2016


Ответы (1)


formalArgs и formals — две функции, которые были бы полезны в этом случае. Если вам нужны только имена параметров, то formalArgs будет более полезным, так как он просто дает имена и игнорирует любые значения по умолчанию. formals дает список в качестве вывода и предоставляет имя параметра в качестве имени элемента в списке и значение по умолчанию в качестве значения элемента.

f <- function(x, y = 3){
  z <- x + y
  z^2
}

> formalArgs(f)
[1] "x" "y"
> formals(f)
$x


$y
[1] 3

Моей первой мыслью было просто предложить formals, и если вам просто нужны имена параметров, вы можете использовать такие имена, как names(formals(f)). Функция formalArgs — это всего лишь оболочка, которая делает это за вас, поэтому работает в любом случае.

Изменить: обратите внимание, что технически примитивные функции не имеют «формалов», поэтому этот метод будет возвращать NULL, если он используется для примитивов. Обойти это можно, сначала обернув функцию в args, прежде чем переходить к formalArgs. Это работает независимо от того, является функция примитивной или нет.

> # formalArgs will work for non-primitives but not primitives
> formalArgs(f)
[1] "x" "y"
> formalArgs(sum)
NULL
> # But wrapping the function in args first will work in either case
> formalArgs(args(f))
[1] "x" "y"
> formalArgs(args(sum))
[1] "..."   "na.rm"
person Dason    schedule 16.11.2016
comment
@МайклЧирико Хммм. Похоже, что все, что является просто оболочкой для вызова .primitive, имеет ту же проблему. - person Dason; 01.06.2017
comment
да, я пытался найти все функции с одним аргументом в базе и столкнулся с этой проблемой - все хорошие - это просто примитивные оболочки - person MichaelChirico; 01.06.2017
comment
@MichaelChirico Думаю, я нашел обходной путь. Технически formalArgs предоставление NULL для примитивов не является ошибкой. На странице справки для formals говорится, что только замыкания имеют формальные, а не примитивные функции. что объясняет, почему это происходит. args сам возвращает замыкание, поэтому «трюк» дает нам то, что мы хотим. - person Dason; 01.06.2017
comment
Обратите внимание, что formals() также работает для f(x=1, y = a) (a является объектом, подобным a <- 3). Затем (для моего случая использования) вы даже можете сделать: formals(f)$y == 'a'. - person Paul Lemmens; 07.11.2019