【问题标题】:The arcane formals(function(x){})$x神秘的形式(function(x){})$x
【发布时间】:2013-05-20 08:52:54
【问题描述】:

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=)

【问题讨论】:

    标签: r metaprogramming


    【解决方案1】:

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

    好吧,首先(如?formals 中所述),formals(function(x) {}) 返回一个pairlist

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

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

    允许使用没有值的标记参数,而“列表”只是忽略它们。

    要查看差异,请比较 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)。

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

    【讨论】:

    • 那我一定要问到底quote(expr=)是什么!相同(quote(expr=),formals(function(x){})$x) == TRUE, but > is(quote(expr=)) [1] "name" "language" "refObject"
    • 不知道能不能比我解释的好很多,尤其是上面最后两段。 quote(expr=)real 值是空符号,但这是一个用户不打算玩弄的内部结构。当您要求像在第二个示例中那样检查它时,R 用零长度名称替换为占位符,因为 R 开发人员不想将空符号的实际结构/类/typeof 等暴露给 R end -用户。因此,您无法使用isclasstypeofstr 等来检查实际的内部结构。
    • 哦,好吧,这是有道理的。我担心我的forms简写(function(x ...与空符号并不完全相同。
    • 所以,我想知道函数的哪些参数没有默认值。我可以将它们的值与那个“空符号”进行比较吗?还是我不应该这样做?
    【解决方案2】:

    这是namesymbol,见?name,例如:

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

    与您的示例的唯一区别是您不能使用as.name 创建一个空的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      相关资源
      最近更新 更多