【问题标题】:R logical(0) in sapplysapply 中的 R 逻辑(0)
【发布时间】:2020-10-21 07:34:47
【问题描述】:

为什么

sapply(c(TRUE, FALSE,logical(0)), 长度)

返回

[1] 1 1

换句话说,为什么逻辑(0)被忽略了?

【问题讨论】:

    标签: r sapply


    【解决方案1】:

    查看逻辑函数帮助,您有:logical(length = 0)。您正在创建一个长度为 0(空)的逻辑对象

    我不能评论,所以我编辑。 这是因为c(TRUE, FALSE, logical(0)) 是一个长度为 2 的对象,因为最后一个元素是空的。然后sapply返回一个长度为2的对象。

    【讨论】:

    • 我不明白这如何解释我忽略了 sapply 中的逻辑(0)。我希望从 sapply 调用中返回 [1] 1 1 0
    【解决方案2】:

    @PenelopeHopHop 说的是真的,但她没有解释错误。错误来自c() 函数结合了它的参数,因为logical(0) 是空的,所以它没有组合起来,使得长度为 2 的 sappply 的输入因此输出长度为 2。

    c(TRUE, FALSE, logical(0))
    #> [1]  TRUE FALSE
    

    如果将c() 替换为list() 可以实现什么

    list(TRUE, FALSE, logical(0))
    #> [[1]]
    #> [1] TRUE
    #> 
    #> [[2]]
    #> [1] FALSE
    #> 
    #> [[3]]
    #> logical(0)
    sapply(list(TRUE, FALSE, logical(0)), length)
    #> [1] 1 1 0
    

    不要使用sapply(..., length),而是使用lengths 函数,因为它可以实现您的目标。

    lengths(list(TRUE, FALSE, logical(0)))
    #> [1] 1 1 0
    

    【讨论】:

    • 感谢您的解释。认为这是 R 做的一件荒谬的事情是否合理?我的意思是,它正在默默地删除向量的一个元素。没有警告。
    • @PejoPhylo 正如我所解释的那样,这并不可笑,因为 c() 函数 将其参数组合成一个向量。所有参数都被强制为一个公共类型,即返回值的类型,并且除了名称之外的所有属性都被删除。 所以它结合了TRUEFALSE 和一个空元素 (logical(0)) 因此只有TRUEFALSE 应该保留。
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多