【发布时间】:2020-10-21 07:34:47
【问题描述】:
为什么
sapply(c(TRUE, FALSE,logical(0)), 长度)
返回
[1] 1 1
换句话说,为什么逻辑(0)被忽略了?
【问题讨论】:
为什么
sapply(c(TRUE, FALSE,logical(0)), 长度)
返回
[1] 1 1
换句话说,为什么逻辑(0)被忽略了?
【问题讨论】:
查看逻辑函数帮助,您有:logical(length = 0)。您正在创建一个长度为 0(空)的逻辑对象
我不能评论,所以我编辑。
这是因为c(TRUE, FALSE, logical(0)) 是一个长度为 2 的对象,因为最后一个元素是空的。然后sapply返回一个长度为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
【讨论】:
c() 函数 将其参数组合成一个向量。所有参数都被强制为一个公共类型,即返回值的类型,并且除了名称之外的所有属性都被删除。 所以它结合了TRUE、FALSE 和一个空元素 (logical(0)) 因此只有TRUE 和FALSE 应该保留。