我有一个函数有时会返回NULL值,有时会返回一个0行的数据框。我想做点别的事。假设对象x
是一个可以是NULL
或0行
x1 <- some operation on x
if(is.null(x) & is.null(x1) { do stuff }
我正在尝试一种方法来查询一个数据框,如果它有0行,它将返回NULL
,如果有任何行,它将返回不是NULL
的数据框。这是因为以下内容不起作用:
while(is.null(x) | dim(x)[1] == 0) { do stuff }
因为当x为null时,当您查询dim(x)
我能想到的每件事都会返回<NA>
而不是NULL
。实际上我认为我的代码看起来像
while(is.null(x) & is.null(some.operation(x)) { do stuff }
答案 0 :(得分:3)
如果我理解你的问题,那么你只需要改变
while(is.null(x)|dim(x)[1]==0){do stuff}
到
while(is.null(x) || dim(x)[1]==0){do stuff}
逻辑OR(|
)运算符是矢量化的。这两方都经常被评估,例如我们始终评估is.null(x)
和dim(x)
。
相反,运算符||
适用于缩放器(实际上它也适用于矢量,但仅使用第一个值)。这意味着我们仅评估dim(x)
,如果 is.null(x)
返回FALSE
。
例如
# Vectorised, so stop is called
TRUE | stop("Now!")
#Error: Now!
带
# Scaler: stop is not evaluated.
TRUE || stop("Now!")
#[1] TRUE
答案 1 :(得分:0)
如果data.frame有0行,则此函数将返回NULL;如果data.frame至少有一行,则此函数将返回行数。
myFunc <- function(x) return(list(NULL, nrow(x))[[(!(is.null(nrow(x) > 0))) + 1L]])
我使用list
将NULL封装为可以返回的元素。列表的第二个元素是行数然后,使用[[
返回正确的列表元素。
以下是一些测试示例
# NULL input
myFunc(NULL)
NULL
# empty data.frame
myFunc(data.frame())
NULL
# data.frame with single element
myFunc(data.frame(a=1))
# data.frame with vector of length 10
[1] 1
myFunc(data.frame(a=1:10))
[1] 10
答案 2 :(得分:0)
我想出了一个解决方案:
ACCOUNTDISABLE
然后我会输入
makeNull<-function(x){
if(is.null(x)) {return(x)}
if(dim(x)[1]==0) {x<-NULL}
x
}
替换
while(is.null(x)&is.null(makeNull(x)){do stuff}