访问 R 中由 Filter(is.atomic, eq) 显示的原子向量


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将返回一个列表。函数lapplysapply通常用于处理列表对象的各个元素。如果您想使用"["或"[["按数字访问它们,则可以使用 length(object) 确定可接受的数字范围。所以object[[length(object)]]会给你最后一个元素(就像(tail(object, 1)一样(。

最新更新