从0行数据帧返回NULL

时间:2017-01-03 15:36:36

标签: r dataframe

我有一个函数有时会返回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 }

3 个答案:

答案 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}