获取R函数的参数名称

33

对于任意一个函数

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

我希望能够获取f的参数名称。

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

这是否可能?


4
请查看?formals - Dason
太棒了!两种都可以。随意回答,我会接受第一个的。 - landau
使用 help("args") 或其中链接的一个函数。 - Roland
@landau 哦,嘿,我认识你。世界真小。 - Dason
是的,@Dason,我还记得你在研究生阶段。怎么样?李哲远拒绝了他获得最佳答案的机会。想要一些简单的积分吗? - landau
1个回答

39

formalArgsformals是在这种情况下非常有用的两个函数。如果你只想要参数名称,那么使用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"

@MichaelChirico 嗯,看起来任何只是包装到 .primitive 调用的东西都有同样的问题。 - Dason
1
是的,我正在尝试在基本库中找到所有的单参数函数,并遇到了这个问题——所有好的函数都只是原始包装器。 - MichaelChirico
@MichaelChirico 我想我找到了一个解决方法。从技术上讲,对于基本类型,formalArgs 提供 NULL 不是一个 bug。formals 的帮助页面说:“只有闭包有形式参数,而原始函数没有。”这就解释了为什么会发生这种情况。args 本身返回一个闭包,这就是为什么这个“技巧”能给我们想要的结果的原因。 - Dason
请注意,formals() 也适用于 f(x=1, y = a)(其中 a 是类似于 a <- 3 的对象)。然后(对于我的用例),您甚至可以执行:formals(f)$y == 'a' - Paul Lemmens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接