假设我有一个如下列表
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
这会产生同样的错误。
我现在有两个问题。如何检查列表是否包含密钥? 如何检查表达式是否为空?
答案 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