对于任意一个函数
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 不是一个 bug。formals
的帮助页面说:“只有闭包有形式参数,而原始函数没有。”这就解释了为什么会发生这种情况。args
本身返回一个闭包,这就是为什么这个“技巧”能给我们想要的结果的原因。 - Dasonformals()
也适用于 f(x=1, y = a)
(其中 a
是类似于 a <- 3
的对象)。然后(对于我的用例),您甚至可以执行:formals(f)$y == 'a'
。 - Paul Lemmens
?formals
。 - Dason