【问题标题】:Create "missing objects" (aka: "empty symbols" , "empty objects") / needed for formals manipulation/创建“丢失的对象”(又名:“空符号”、“空对象”)/形式操作所需/
【发布时间】:2011-04-22 23:56:06
【问题描述】:

如何在 R 中创建一个“空对象”? [编辑:我不知道如何正确称呼这个“东西”,所以我称它为“空对象”,其他:“空符号”、“零长度符号”、“缺失对象”也可能被使用]

[edit2:最后,我倾向于将“缺少的符号对象”作为“事物”的名称。 J.Chambers 似乎也在他 2008 年的书中使用了这个术语,请参阅 cmets 以获取 @mbq 的答案。根据钱伯斯的说法,“缺失符号”的内容是零长度的字符串。因此, as.symbol("") 应该创建这样一个对象,它在当前版本的 R(2.11.1) 中没有 ]

我能找到的最简单的方法是

x <- alist(a=)$a

[澄清]

请注意,“空对象”不是 NULL 对象或长度为 0 的向量。 上面示例中的“空对象”x 可以用于函数的形式操作,这正是我需要的。

这是一个例子:

> al <- alist(a = 323, b = , c = 434)  
> al  
$a  
[1] 323  
$b  
$c  
[1] 434  

>   
> al[["c"]] <- numeric()  
> al  
$a  
[1] 323  
$b  
$c                                   #not empty  
numeric(0)  

>   
> al[["c"]] <- list()              
> al  
$a  
[1] 323  
$b  
$c                                   #not empty  
list()  

>   
>   
> al[["c"]] <- NULL                    #object removed  
> al  
$a  
[1] 323  
$b  


>   
> al[["c"]] <- alist(a = )$a  
> al  
$a  
[1] 323  
$b  
$c                                      #empty  

所以,我只是在寻找一种方法来创建用于函数形式操作的空对象。我很确定base R中一定有办法。

这是一个例子:

> foo <- function(a = 3232, b = 234){b+a}  
> formals(foo)  
$a  
[1] 3232  

$b  
[1] 234  

> formals(foo)$c <- alist(a = )$a  
> formals(foo)  
$a  
[1] 3232  

$b  
[1] 234  

$c  


> foo <- function(a = 3232, b = 234){b+a}  
> formals(foo)  
$a  
[1] 3232  

$b  
[1] 234  

> formals(foo)$c <- alist(a = )$a  
> formals(foo)  
$a  
[1] 3232  

$b  
[1] 234  

$c  

谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:

    试试substitute():

    foo <- function(a = 3232, b = 234) {}
    formals(foo)$c <- substitute()
    foo
    # function (a = 3232, b = 234, c)
    

    【讨论】:

    • bquote 目前做同样的事情。我个人不会依赖这种行为,因为它是无证的,还有其他方法可以达到相同的结果。
    【解决方案2】:

    正如其他人所说,您不是在创建一个空对象。 x 包含一个值,它是一个未计算的表达式。

    ?alist 说:

    ‘alist’ 处理它的参数,就好像它们描述了函数参数一样。 所以值不会被评估,并且没有值的标记参数是 允许,而“列表”只是忽略它们。 “alist”最常用于 与“formals”连用。

    这是我能确定的向函数添加没有值的参数的最简单方法:

    > foo <- function(a = 3232, b = 234){b+a}
    > formals(foo) <- c(formals(foo),alist(c=))
    > formals(foo)
    $a
    [1] 3232
    
    $b
    [1] 234
    
    $c
    

    【讨论】:

    • 未计算的表达式也是对象:)。在形式中替换 c 怎么样?如果 c 已经存在,您的解决方案将尝试在其中创建两个 c。有趣的是,R 会允许它!
    • 我完全同意,这就是为什么询问如何创建“空”对象没有意义。
    • 我的解决方案不会创建两个“c”,它会在配对列表中添加另一个表达式。您正在尝试使用该语言进行编程,这与使用该语言进行编程非常不同。您需要阅读 R 语言定义this section。 R 允许它,因为它是一个有效的表达式。
    • 我说过“如果 c 已经存在”,formals(foo)
    【解决方案3】:

    没有“空对象”。有 NULL、NA(各种风格)、零长度列表等等。您对“空对象”的概念从何而来,“空对象”的属性是什么?

    你用 alist 创建的是一个怪物:

    > x<-alist(a=)$a
    > x
    Error: argument "x" is missing, with no default
    

    [它是某种未评估的函数参数表达式。不是我所知道的任何意义上的“空物体”]

    【讨论】:

    • 是的,它确实是一个未经评估的空“东西”。
    【解决方案4】:

    还有d &lt;- ""

    (填充填充填充)

    【讨论】:

    • 这真的是评论,而不是问题的答案。请使用“添加评论”为作者留下反馈。
    • 我不同意,这只是一个非常简短的答案。用户要求一个空对象。在 R 中,“空”是一个主观术语。
    【解决方案5】:

    你对alist(a=)$a做了什么不是空对象,它是空符号/名称(''编译为符号名称)。我很确定它不能以任何其他方式复制(as.symbol('') 引发错误)。

    【讨论】:

    • x 保存一个值,它是一个对象。我不太确定符号是那个“东西”的更好名称:)
    • 嗯,再想一想,确实是一个不求值的表达式,就是“空”。所以可能从技术上讲,要求空符号是正确的。另一方面,R 中的名称也是一个对象,所以它也没有错。
    • is.symbol(formals(plot)$x)deparse(formals(plot)$x)。这表明as.symbol("") 是正确的方法,但它在当前版本的 R 中不起作用。
    • 是的,确实应该如此。以下是 (Chambers 2008, p55) 的摘录:“一个奇怪的细节与没有默认表达式的参数有关。形式列表中对应于 x 的元素似乎是空的,但它必须是一个对象。(每件事是一个对象。)实际上,它是R中的异常名称或符号对象,其内容为空字符串。所以它是“缺少符号对象”,“事物”的正确名称是什么。
    • @VitoshKa 它的“符号”就是它在 R 中的调用方式;问题只是您一直在寻找其他东西:具有空绑定 c 的 pairlist。 @hadley 但你必须承认这就是这件事的真正意义。
    【解决方案6】:

    还有d &lt;- c()

    【讨论】:

    • 无论谁投了反对票,至少试着解释一下你为什么投反对票。
    【解决方案7】:

    取决于类型:

    x <- list()
    # empty vectors
    y <- numeric(0)
    z <- logical(0)
    ...
    

    现在你必须考虑是否真的要创建一个空对象。

    edit :您确实也可以使用 NULL 选项。主要区别在于 NULL 对象没有类型。另见?"NULL"

    【讨论】:

    • numeric(0) 等于numeric(),与logical() 相同。
    • 我需要空对象而不仅仅是长度为 0 的对象。我将编辑 Q 使其更精确。
    • @VitoshKa -- R 中没有空对象,只有 NULL 对象加减号用于此目的。看我的回答。
    • @mbq -- 那你怎么称呼我在我的例子中创建的对象呢?
    猜你喜欢
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多