在R中,如何检查列表是否包含特定键?

时间:2013-11-12 23:48:57

标签: r

假设我有一个如下列表

foo=list(bar="hello world")

我想检查一下我的列表是否有特定的密钥。 我发现foo$bar2会返回NULL以查找不等于bar2的任何bar,所以我想我可以检查返回值是否为空,但这不是似乎工作:

if (foo$bar2==NULL) 1 # do something here

但是,这会产生错误:

Error in if (foo$bar2 == NULL) 1 : argument is of length zero

然后我尝试了NULL是否等于false,就像在C:

中一样
if (foo$bar2) 1 # do something here

这会产生同样的错误。

我现在有两个问题。如何检查列表是否包含密钥? 如何检查表达式是否为空?

1 个答案:

答案 0 :(得分:27)

“键”的概念在R中称为“名称”。

if ("bar" %in% names(foo) ) {  print("it's there") }  # ....

它们存储在名为.Names的特殊属性中,并使用names函数提取:

dput(foo)
#structure(list(bar = "hello world"), .Names = "bar")

我在这里提出了一个语义上的谨慎,因为这个词的两个截然不同的共同混淆源:R中的“名字”:有.Names - 属性,但有一个完全不同的用法R中的单词name与字符串或标记有关,其值独立于任何检查或提取函数,如$[。任何以字母或句号开头并且其中包含其他特殊字符的标记都可以是有效的name。可以使用函数exists测试它,并给出其name的引用版本:

 exists("foo")  # TRUE
 exists(foo$bar) #    [1] FALSE
 exists("foo$bar")#    [1] FALSE

因此,单词name在R中有两个不同的含义,您需要了解这种歧义,以了解语言的部署方式。 .Names含义是指具有特殊目的的属性,而names - 含义是指所谓的“语言 - 对象”。单词symbol是该单词的第二个含义的同义词。

is.name( quote(foo) ) #[1] TRUE

然后展示你关于测试无效的第二个问题可能会如何:

if( !is.null(foo$bar) ) {  print("it's there") }  # any TRUE value will be a 1