如何捕获整数(0)?
Posted
技术标签:
【中文标题】如何捕获整数(0)?【英文标题】:How to catch integer(0)? 【发布时间】:2011-09-21 00:34:43 【问题描述】:假设我们有一个产生integer(0)
的语句,例如
a <- which(1:3 == 5)
捕捉这个最安全的方法是什么?
【问题讨论】:
我不喜欢将其视为错误的想法——事实上,R 的不折叠某些空对象的策略有助于避免许多错误恢复流程,从而导致代码更简洁。 不要使用哪个。 您可以使用any
进行测试。它将为 which(1:3==5)
或 1:3==5
返回 FALSE。
@BondedDust 我试图找到integer(0)
,以which
为例。
我知道这是旧的,但你能不能,哈德利,请概述为什么不使用which
?这对我避免错误代码非常有帮助。
【参考方案1】:
这是 R 打印零长度向量(整数 1)的方式,因此您可以测试 a
的长度是否为 0:
R> length(a)
[1] 0
可能值得重新考虑您用来确定哪些元素所需的策略,但如果没有进一步的具体细节,很难提出替代策略。
【讨论】:
值得向未来的读者指出length(NULL) == 0
也是TRUE
。 user E Nord's answer 将是仅测试 integer(0)
的选项【参考方案2】:
如果它的长度特别为零整数,那么你想要类似的东西
is.integer0 <- function(x)
is.integer(x) && length(x) == 0L
检查:
is.integer0(integer(0)) #TRUE
is.integer0(0L) #FALSE
is.integer0(numeric(0)) #FALSE
您也可以为此使用assertive
。
library(assertive)
x <- integer(0)
assert_is_integer(x)
assert_is_empty(x)
x <- 0L
assert_is_integer(x)
assert_is_empty(x)
## Error: is_empty : x has length 1, not 0.
x <- numeric(0)
assert_is_integer(x)
assert_is_empty(x)
## Error: is_integer : x is not of class 'integer'; it has class 'numeric'.
【讨论】:
你可以只使用!length(x)
而不是length(x)==0
@詹姆斯。是的,但我认为这两种方式都没有太大的性能问题,length(x) == 0L
对我来说更清楚。
@RichieCotton。与 0 相对的 0L 是怎么回事?我试过用谷歌搜索它,但我没有找到任何相关的东西。对死灵术感到抱歉。
@Ben:为数字添加L
后缀会使 R 将其存储为整数而不是浮点值。参见,例如,cran.r-project.org/doc/manuals/R-lang.html#Constants
谢谢!它节省了我的时间。【参考方案3】:
也许跑题了,但是 R 有两个很好的、快速的和空感知函数来减少逻辑向量——any
和 all
:
if(any(x=='dolphin')) stop("Told you, no mammals!")
【讨论】:
是的,如果有类似is.empty
的东西会很棒,因为有些函数返回integer(0)
而不是NA
或NULL
。但是现在你的方法是最直接的,并且是矢量的,这比length(a)
有很大的优势。【参考方案4】:
受 Andrie 回答的启发,您可以使用 identical
并通过使用它是该对象类的空集并将其与该类的元素组合这一事实来避免任何属性问题:
attr(a, "foo") <- "bar"
identical(1L, c(a, 1L))
#> [1] TRUE
或更笼统地说:
is.empty <- function(x, mode = NULL)
if (is.null(mode)) mode <- class(x)
identical(vector(mode, 1), c(x, vector(class(x), 1)))
b <- numeric(0)
is.empty(a)
#> [1] TRUE
is.empty(a,"numeric")
#> [1] FALSE
is.empty(b)
#> [1] TRUE
is.empty(b,"integer")
#> [1] FALSE
【讨论】:
这不是最简单的答案,但对初学者来说是迄今为止最简单、最安全的答案。【参考方案5】:if ( length(a <- which(1:3 == 5) ) ) print(a) else print("nothing returned for 'a'")
#[1] "nothing returned for 'a'"
转念一想,我认为任何比length(.)
更漂亮:
if ( any(a <- which(1:3 == 5) ) ) print(a) else print("nothing returned for 'a'")
if ( any(a <- 1:3 == 5 ) ) print(a) else print("nothing returned for 'a'")
【讨论】:
【参考方案6】:你可以很容易地用函数 same(x,y) 捕获整数(0)
x = integer(0)
identical(x, integer(0))
[1] TRUE
foo = function(x)identical(x, integer(0))
foo(x)
[1] TRUE
foo(0)
[1] FALSE
【讨论】:
【参考方案7】:另一个选项是rlang::is_empty
(如果您在 tidyverse 中工作,这很有用)
通过library(tidyverse)
附加tidyverse 时似乎没有附加rlang 命名空间 - 在这种情况下,您使用的是purrr::is_empty
,它只是从rlang
包中导入的。
顺便说一句,rlang::is_empty
使用 user Gavin's approach。
rlang::is_empty(which(1:3 == 5))
#> [1] TRUE
【讨论】:
【参考方案8】:isEmpty()
包含在 S4Vectors 基础包中。无需加载任何其他包。
a <- which(1:3 == 5)
isEmpty(a)
# [1] TRUE
【讨论】:
嗯 .. S4Vectors 是一个额外的包,并且(截至今天)不在 CRAN 上以上是关于如何捕获整数(0)?的主要内容,如果未能解决你的问题,请参考以下文章
Lambda 在无穷无尽的流中使用整数捕获闭包抛出 OutOfMemoryError