Filter(is.atomic, something)
返回原子向量。
1. 天气 - 这里的例子
> Filter(is.atomic, study)
$region
[1] "Hamburg" "Bremen"
2. 马赛克图作为树图-示例在这里
> Map(function(x) Filter(is.atomic, x), ls())
$g
[1] "g"
$lookup
[1] "lookup"
$req.data
[1] "req.data"
$tmp
[1] "tmp"
$tmp1
[1] "tmp1"
看他们的立场可以是任意的,我可能对他们的数据结构有最微弱的线索,所以不能使用var$some$...$vector
。我觉得需要?Position
.发挥你的想象力,例子不是排他性的。如何访问它们的原子矢量?
要展平列表以便访问原子向量,可以使用以下函数:
flatten.list <- function(x){
y <- list()
while(is.list(x)){
id <- sapply(x,is.atomic)
y <- c(y,x[id])
x <- unlist(x[!id],recursive=FALSE)
}
y
}
此函数维护元素的名称。用法,使用文森特答案中的列表 x:
x <- list(
list(1:3, 4:6),
7:8,
list( list( list(9:11, 12:15), 16:20 ), 21:24 )
)
然后:
> flatten.list(x)
[[1]]
[1] 7 8
[[2]]
[1] 1 2 3
[[3]]
[1] 4 5 6
[[4]]
[1] 21 22 23 24
...
要递归地对列表中的所有原子元素执行操作,请使用rapply()
(这是 Vincent 基本上手动编码的内容(。
> rapply(x,sum)
[1] 6 15 15 30 54 90 90
> rapply(x,sum,how='list')
[[1]]
[[1]][[1]]
[1] 6
[[1]][[2]]
[1] 15
[[2]]
[1] 15
...
另请参阅?rapply
PS :您的代码Map(function(x) Filter(is.atomic, x), ls())
没有意义。 ls()
返回一个字符向量,因此该字符向量的每个元素都将作为列表的一部分返回。这根本不告诉你任何事情。
除此之外,Filter()
不会做你认为它做的事情。以示例列表为例 x
,从文森特的回答来看,只访问它的原子部分非常容易。 Filter()
仅返回第二个元素。这是唯一的原子元素。 Filter(is.atomic, x)
100% 等效于:
ind <- sapply(x, is.atomic)
x[ind]
至少可以说,您的问题非常不清楚:您拥有的输入数据和所需输出的示例会有所帮助......
既然你建议我们"发挥我们的想象力",我假设你有一个分层的数据结构,即一个列表列表......列表,其深度未知。例如
x <- list(
list(1:3, 4:6),
7:8,
list( list( list(9:11, 12:15), 16:20 ), 21:24 )
)
叶子是向量,你想用这些向量做"一些事情"。
例如,您可能希望将它们连接成单个向量:这就是unlist
函数的作用。
unlist(x)
你也可以想要所有的叶子,在一个列表中,即一个向量列表。您可以轻松编写一个(递归(函数来探索数据结构并逐步构建该列表,如下所示。
leaves <- function(u) {
if( is.atomic(u) ) { return( list(u) ) }
result <- list()
for(e in u) {
result <- append( result, leaves(e) )
}
return(result)
}
leaves(x)
您可能还希望将函数应用于所有叶子,同时保留数据的结构。
happly <- function(u, f, ...) {
if(is.atomic(u)) { return(f(u,...)) }
result <- lapply(u, function(v) NULL) # List of NULLs, with the same names
for(i in seq_along(u)) {
result[[i]] <- happly( u[[i]], f, ... )
}
return( result )
}
happly(x, range) # Apply the "range" function to all the leaves
Filter
将返回一个列表。函数lapply
和sapply
通常用于处理列表对象的各个元素。如果您想使用"["或"[["按数字访问它们,则可以使用 length(object)
确定可接受的数字范围。所以object[[length(object)]]
会给你最后一个元素(就像(tail(object, 1)
一样(。