Для произвольной функции
f <- function(x, y = 3){
z <- x + y
z^2
}
Я хочу иметь возможность принимать имена аргументов f
> argument_names(f)
[1] "x" "y"
Это возможно?
Для произвольной функции
f <- function(x, y = 3){
z <- x + y
z^2
}
Я хочу иметь возможность принимать имена аргументов f
> argument_names(f)
[1] "x" "y"
Это возможно?
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"
formalArgs
предоставление NULL для примитивов не является ошибкой. На странице справки для formals
говорится, что только замыкания имеют формальные, а не примитивные функции. что объясняет, почему это происходит. args
сам возвращает замыкание, поэтому «трюк» дает нам то, что мы хотим.
- person Dason; 01.06.2017
formals()
также работает для f(x=1, y = a)
(a
является объектом, подобным a <- 3
). Затем (для моего случая использования) вы даже можете сделать: formals(f)$y == 'a'
.
- person Paul Lemmens; 07.11.2019
?formals
- person Dason   schedule 16.11.2016