【问题标题】:In R, how can I check whether a list contains a particular key?在 R 中,如何检查列表是否包含特定键?
【发布时间】:2022-04-04 06:26:33
【问题描述】:

假设我有一个如下列表

foo=list(bar="hello world")

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

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

这给出了同样的错误。

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

【问题讨论】:

  • 使用is.null(...) 来查看是否为空
  • 检查列表是否包含密钥是什么意思?这种情况下的“关键”是什么?
  • 键是列表中元素的名称。这里的有效密钥是bar。我不确定R 社区是否有不同的词,但R 列表对我来说就像一个 Python 字典,这就是为什么我将这个名称称为“键”。

标签: r


【解决方案1】:

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

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

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

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

我在这里提出语义上的警告,因为这个词的两种不同用法造成了一个常见的混淆来源:R中的“名称”:有.Names-attributes,但是这个词的用法完全不同R 中的name 与字符串或标记有关,其值独立于任何检查或提取函数,如$[。任何以字母或句点开头且没有其他特殊字符的标记都可以是有效的name。给定其name 的引用版本,可以使用函数exists 对其进行测试:

 exists("foo")  # TRUE
#assume ‘foo’ is a list with a named element “bar”
exists(”bar”)  #  [1] FALSE (even though it’s a “name”
 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

【讨论】:

    猜你喜欢
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2015-09-23
    • 2011-05-05
    相关资源
    最近更新 更多