神秘的形式(function(x){})$ x

时间:2013-05-24 17:12:49

标签: r metaprogramming

什么是对象formals(function(x){})$x

它在函数的形式中找到,绑定到没有默认值的参数。

有没有其他方法来引用这个奇怪的物体?它是否除了表示空函数参数之外还有其他作用吗?

以下是一些可在控制台中检查的属性:

> is(formals(function(x){})$x)
[1] "name"      "language"  "refObject"
> formals(function(x){})$x

> as.character(formals(function(x){})$x)
[1] ""

编辑:以下是获取此对象的其他方法:

alist(,)[[1]]
bquote()
quote(expr=)

2 个答案:

答案 0 :(得分:9)

背景:什么是formals(function(x) {})

好吧,首先(?formals中记录),formals(function(x) {})会返回 pairlist

is(formals(function(x){}))
# [1] "pairlist"

list 对象不同, pairlist 对象可以包含不包含值的命名元素 - 在构造具有可能的可选形式参数的函数时,这是一件非常好的事情。来自?pairlist

  

允许带有无值的标记参数,而'list'只是忽略它们。

要查看差异,请将创建了pairlists的alist()与构建“普通旧”列表的list()进行比较:

list(x=, y=2)
# Error in list(x = , y = 2) : argument 1 is empty

alist(x=, y=2)
# $x
# 
# $y
# [1] 2

您的问题:什么是formals(function(x) {})$x

现在问你关于formals(function(x) {})$x是什么的问题。我的理解在某种意义上它的真实值是“空符号”。但是,你不能从R内部得到它,因为“空符号”是R的开发人员 - 非常多的设计 - 试图完全隐藏R用户。 (有关空符号的有趣讨论,以及它为何被隐藏,see the thread starting here)。

当一个人试图通过索引一个pairlist的空值元素来获取它时,R的开发人员通过让R返回该元素的 name 而不是它的verbotten-for-public来阻止该尝试 - 查看。 (当然,这是您问题中显示的名称对象)。

答案 1 :(得分:3)

这是namesymbol,请参阅?name,例如:

is(as.name('a'))
#[1] "name"      "language"  "refObject"

与您的示例的唯一区别在于您无法使用as.name创建一个空的。