21

假设我有一个如下列表

foo=list(bar="hello world")

我想检查我的列表是否有特定的键。我观察到任何不等于的foo$bar2都会返回,所以我想我可以检查返回值是否为空,但这似乎不起作用:NULLbar2bar

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

这给出了同样的错误。

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

4

1 回答 1

40

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

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

它们存储在一个特殊的属性中,该属性.Names使用以下函数命名和提取names

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

我在这里提出语义警告,因为由于单词的两种不同用法导致混淆的常见来源: R 中的“名称”:有 -.Names属性,但nameR 中单词的完全不同的用法必须做使用具有独立于任何检查或提取函数(如$or )的值的字符串或标记[。任何以字母或句点开头且不含其他特殊字符的标记都可以是有效的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
于 2013-11-13T00:04:52.380 回答