(s) 将子集(即`[`)应用于各种列表结构

(s)applying subset (i.e. `[`) to various list structures

我有一个函数,我希望能够从中 return 一组非常轻松的结构:

str1 <- list(
          list(
            key = 123,
            data = "test"
          ),
          list(
            key = 987,
            data = "test"
          )
        )

str2 <- list(
          c(key = 123, data = "test"),
          c(key = 987, data = "test")
        )

str3 <- list(
          key = 123,
          data = "test"
        )

str4 <- c(key = 123, data = "test")

从这些 return 值中,我希望能够以简洁的方式捕获所有键值。

我尝试的包罗万象的解决方案是这样的:

sapply(str1, `[`, "key")

但是,它仅适用于嵌套结构(str1 & str2)。其他returnNA.

我很好奇为什么我可以这样做:

str4["key"]
# 123
sapply(c(key = 1), `+`, 1)
# 2

...但不是这个?

sapply(c(key = 123), `[`, "key")
# NA

我对变通方法不感兴趣,因为我想了解哪里出了问题。

要了解最后两行代码之间的区别,您可以这样做:

> sapply(c(key = 123), function(i) browser())
Called from: FUN(X[[i]], ...)
Browse[1]> i
[1] 123
Browse[1]> i+1
[1] 124
Browse[1]> i['key']
[1] NA

您基本上是在尝试按名称提取...未命名向量上的值。

要解决您的问题,可能的方法是:

foo = function(str, key) {l=unlist(str); l[names(l) %in% key]}

#> foo(str1,'key')
#  key   key 
#"123" "987" 
#> foo(str2,'key')
#  key   key 
#"123" "987" 
#> foo(str3,'key')
#  key 
#"123" 
#> foo(str4,'key')
#  key 
#"123"