使访问不存在的列表元素成为错误

时间:2018-01-30 17:08:29

标签: r

在R中,可以使用$访问列表元素。当访问未包含在列表中的字段时,结果值仅为NULL。这在我的代码中我进一步使用对象的部分是有问题的。拿这个代码:

l <- list(foo = 1, bar = 2)
print(l$foobar)

输出只是NULL,没有错误,也没有警告。我知道可能需要这样做,以便分配新元素(l$foobar <- 3)。

如果某个字段不存在,我是否可以通过某种方式对列表中的字段进行读取访问?

4 个答案:

答案 0 :(得分:3)

您可以尝试编写自己的函数:

extract_ls <- function(ls, el){
  if (!el %in% names(ls)) stop(paste0("The specified element ", el, " does not exist in the list"))
  else return(ls[[el]])
}

然后你可以这样做:

extract_ls(l, "baz")
#Error in extract_ls(l, "baz") : 
# The specified element baz does not exist in the list

extract_ls(l, "bar")
#[1] 2

请注意,我使用[[代替$。这两个执行相同的操作,但$进行部分匹配。另外[[需要一个字符串。

要使其成为中缀函数,只需将函数名称更改为`%[[%`即可。用法是:

l %[[% "baz"
#Error in l %[[% "baz" : 
#  The specified element baz does not exist in the list


l %[[% "bar"
#[1] 2

答案 1 :(得分:3)

一个极端的选择是重载$运算符,然后为检查名称的列表对象定义一个S3方法。

`$` <- function(x, y) { 
  UseMethod("$")
}

`$.list` <- function(x, y) {
  ylab <- deparse(substitute(y))
  stopifnot(ylab %in% names(x))
  do.call(.Primative("$"), list(x, ylab))
}

然后:

myList <- list('a' = pi)

> myList$b
Error: ylab %in% names(x) is not TRUE

> myList$a
3.141593

当然,您必须确保设置以下内容:

`$.default` <- base::`$`

避免与“$”运算符的现有用法发生冲突

如果您希望在应用于列表时继续使用与“$”的部分匹配,则可以使用stopifnot(length(pmatch(ylab, names(x)))>0)

答案 2 :(得分:1)

我知道这是一个老问题,已经接受了编写自定义函数的答案,但我认为来自 get R 的 base 也应该这样做:

l <- list(foo = 1, bar = 2)
get('foobar', l)
#> Error in get("foobar", l): object 'foobar' not found

答案 3 :(得分:-1)

试试这个

 el_names <- function(l,variable)
       {
         if(is.null(l[[variable]]) & length(l)>1)               
           {

            stop("Null found")
           }
        else{
            print(l[[variable]])
            }
       }


> el_names(l,"foo")
[1] 1