(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"
我有一个函数,我希望能够从中 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"