【问题标题】:apply vector in double square brackets in R在R中的方括号中应用向量
【发布时间】:2015-05-28 03:26:08
【问题描述】:

有没有办法将向量应用于 R 中的 [[]]

例如b 是一个列表

b <- list(16,'dsdfs',35)
a <- c(1:3), b[[a]]

它不起作用,我知道 [[]] 和 $ 只接受单个值,[] 接受向量,但是 b[a] 是列表的列表,这不是我想要的。

有没有办法解决这个问题,因为真的很烦,我不敢用lapply。只是因为它返回列表列表的列表,除了使用 [[]] 或 $ 我没有其他方法可以进入原子元素。但是 [[]] 和 $ 不好做循环。

像 python 一样,你总是可以用 [] 走得更远,例如列表[3][2][3]...

R 有同样的东西吗?

谢谢。

【问题讨论】:

  • 也许unlist(b[a])是你想要的?
  • 想要的结果是什么?
  • 我怀疑用分号替换a &lt;- c(1:3), b[[a]] 中的逗号并使用“[”而不是“[”可以解决所有问题。它将提供一份清单。
  • 请阅读“[”和“[[”的帮助页面,其中明确强调“[[”只能接受导致单个值的参数。如果被访问的结构允许,它可以接受一个包含多个元素的参数。
  • @JasonAizkalns 谢谢你的建议,实际情况我是不能用的,因为unlist会把所有的list都unlist,包括list里面的list,其实我就是想unlist最外面的列表,并保留所有内部列表。

标签: r list lapply data-retrieval


【解决方案1】:

到目前为止,您的示例在语法上是错误的。我假设你打算写:

a <- c(1:3); b[[a]]
#Error in b[[a]] : recursive indexing failed at level 2

如果您的意图是返回“a”列表的所有三个元素,那么您根本不能使用“[[”,除非您将它包装在一些循环函数中。如果你使用sapply,你会得到一个字符向量。

  sapply(a, function(x) b[[x]])
 [1] "16"    "dsdfs" "35"  

这可能是您的目标。

为了说明如何将多元素向量传递给“[[”而不是让它引发错误,请看这个:

> b2 <- list(16,list('test','dsdfs'),35)
> a <- c(1:3); b2[[c(2,1)]]
[1] "test"

向量:c(2,1) 被 "[[" 扩展为与以下相同的调用:

 b2[[2]][[1]]

b2[[2]] 返回list('test','dsdfs'),然后将[[1]] 应用于该结果并返回原子向量'test'。这就是前面的错误消息称为“递归索引”的内容,但在这种情况下,该进程能够找到要返回的单个列表元素,因为连续/递归提供给“[[”的所有索引都能够传递一个列表项值。

【讨论】:

  • 只是为了补偿你,我喜欢你的回复
  • 我想知道 unlist(b[a]) 是否可以代替 sapply 循环
  • @Nemo:当我收到弹出窗口说问题已被删除时,我正在写一个指向 R-FAQ 7.30 的 match.fun 错误的答案。您仍然可以从第 7 节中的项目列表中受益。
  • @DavidArenburg:当然。我只是想遵守使用“[[”的要求。
  • @BondedDust 非常感谢,它对我帮助很大!然后我可以使用 [[c(a,b,..)]] 进入列表。
猜你喜欢
  • 2014-11-22
  • 2017-11-17
  • 2021-08-10
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多