访问R中过滤器(is.atomic,eq)显示的原子向量

访问R中过滤器(is.atomic,eq)显示的原子向量,r,functional-programming,R,Functional Programming,返回原子向量 1。天气-示例 2。马赛克图作为树形图-示例 看,它们的位置可以是任意的,我可能对它们的数据结构有最模糊的线索,所以不能使用var$some$…$vector。我觉得需要?职位。运用你的想象力,这些例子并不是唯一的。我如何访问它们的原子向量 至少可以说,您的问题非常不清楚:您拥有的输入数据和所需输出的示例将有助于 既然你建议我们“运用我们的想象力”,我假设你有一个分层的数据结构,也就是说,一个列表的列表,它的深度是未知的。比如说, > Map(function(x) Filt

返回原子向量

1。天气-示例

2。马赛克图作为树形图-示例


看,它们的位置可以是任意的,我可能对它们的数据结构有最模糊的线索,所以不能使用
var$some$…$vector
。我觉得需要
?职位
。运用你的想象力,这些例子并不是唯一的。我如何访问它们的原子向量

至少可以说,您的问题非常不清楚:您拥有的输入数据和所需输出的示例将有助于

既然你建议我们“运用我们的想象力”,我假设你有一个分层的数据结构,也就是说,一个列表的列表,它的深度是未知的。比如说,

> 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"
你也可以想要所有的叶子,在一个列表中,也就是说,一个向量列表。 您可以轻松编写一个(递归)函数来探索数据结构并逐步构建该列表,如下所示

unlist(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
要递归地对列表中的所有原子元素执行操作,请使用
rappy()
(Vincent基本上是手工编码的)

另请参见《Rappy》

PS:您的代码
Map(函数(x)过滤器(is.atomic,x),ls())
没有意义
ls()
返回一个字符向量,因此该字符向量的每个元素都将作为列表的一部分返回。这根本没告诉你什么

除此之外,
Filter()
不会做您认为它会做的事情。以Vincent的答案中的示例列表
x
为例,只访问其中的原子部分非常容易
Filter()
只返回第二个元素。那是唯一的原子元素<代码>过滤器(is.atomic,x)100%等效于:

> 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

...

ind
Filter
将返回一个列表。函数
lappy
sapply
通常用于处理列表对象的各个元素。如果您想使用“[”或“[[”按数字访问它们,那么您可以使用
length(object)
确定可接受的数字范围。因此
object[[length(object)]
将为您获取最后一个元素(就像(
tail(object,1)
)。

这不是反对票的原因(相互攻击).我没有投反对票,但我知道为什么有人可能会投反对票-你的问题不是很清楚。你只是想访问你链接到的对象中的向量吗?你想遍历任意列表并返回原子向量吗?你可以给出一个显式示例,其中包含预期的输出,这样就很清楚你想要什么。加文的答案是+1,但我认为nk用一种更中性的语气问“为什么否决票?”是合理的——出于教育的目的……是否有某种函数返回自身
I:=(lambda x.x)
?我的意思是
rappy(x,returntheatomicvectorsateyare)
dput(rappy(x,unlist))
返回
1:24
,不保留结构。
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
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 <- 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(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

...
ind <- sapply(x, is.atomic)
x[ind]