针对NULL和其他测试变量

时间:2018-06-22 00:00:02

标签: r

我要测试某些属性的变量,但是这些变量通常是NULL

我尝试过:

x = NULL
if (!is.null(x) & names(x) == 'a') {
  return(0)
}

但这返回:

Error in if (!is.null(x) & names(x) == "a") { : 
  argument is of length zero

有什么办法解决吗?

我不想写:

if (!is.null(x)) {
  if (names(x) == 'a') {
    return(0)
  }
}

随着许多else的出现,这种情况将迅速发展。

我尝试提供一个测试NULL是否为函数以及任意测试,但是我在范围上遇到了麻烦(我认为):

 is.null.test = function(x, test = NULL) {
  if (is.null(x)) {
    return(FALSE)
  } else if (is.null(test)){
    return(FALSE)
  } else {
    eval(parse(text = test))
  }
}

test = 'names(x) == "a"'
is.null.test(x = list(shape = 'a'), test = test)

1 个答案:

答案 0 :(得分:0)

如果这是您要的内容,我不是绝对肯定的人,但是这里有一些选择。如果您正在使用列表,并且希望同时满足两个条件的列表中的索引,则可以尝试以下操作:

my_list <- list(j = c(8:17), b = NULL, a = c(2,8,0), k = NULL)
which(!is.null(my_list) & names(my_list) %in% "a")
[1] 3

如果您确实希望像示例中那样return(0),则可以尝试以下操作:

ifelse(!is.null(my_list) & names(my_list) %in% "a", 0, NA)
[1] NA NA  0 NA

在两种情况下,请注意,我使用names() %in%而不是names() ==。对于您的示例,==可以很好地工作,但是如果您要使用多个名称,则%in%会更好一些。

ifelse(!is.null(my_list) & names(my_list) %in% c("a", "b"), 0, NA)
[1] NA  0  0 NA
which(!is.null(my_list) & names(my_list) %in% c("a", "b"))
[1] 2 3

如果这不是您想要的,请给我更多详细信息,我将编辑答案。