R中的动态类数组结构?
Posted
技术标签:
【中文标题】R中的动态类数组结构?【英文标题】:Dynamic Array-Like Structure In R? 【发布时间】:2012-01-03 09:53:54 【问题描述】:在 R 编程语言中,如何获得动态数组 (as described on Wikipedia) 或等效数据结构?我想要具有以下属性的东西:
O(1) 索引。
附加的摊销 O(1)。
O(N) 或更少的空间浪费。
类型参数,即可以保存列表、用户定义的对象、函数、矩阵等,而不仅仅是数字。
应该支持不命名的追加。因此,使用环境不会削减它。
据我所知,using a list doesn't work 因为按照以下方式附加到一个需要 O(N) 时间,而不是摊销 O(1):
foo <- list()
foo[[length(foo) + 1]] <- 1
【问题讨论】:
据我所知,基本 R 中没有这样的东西。它是针对特定用例的吗?如果是这样,也许有一个更 R-ish 的解决方案可以满足您的需求。 @Aaron:没有具体的用例。我问是因为我试图理解 R 作为通用高级语言的能力。我经常做需要一些统计/机器学习和一些通用编程的项目。我通常使用通用语言和用于统计/机器学习的普通旧库而不是 R 来执行这些操作。每次我尝试使用它时,R 都感觉过于针对特定领域。我正在尝试看看我是否遗漏了什么,而 R 可能工作得很好,可以在我的一些统计量更大的项目中使用通用的东西。 站在一般程序员的角度,你的评估可能是正确的。 R 最初是为统计学家而构建的,虽然随着它的成熟,它越来越像一种通用语言,但我怀疑 CS 人员仍然会觉得它缺少一些东西。我很想知道在接下来的几年里会发生什么;它已经变得有点像常规的编程语言了(我特别想的是 S4 方法)。 另外,我看到你有一些 C++ 经验;如果您还没有,您应该查看Dirk Eddelbuettel 的Rcpp 包,这使得在 R 中集成 C++ 代码变得更加容易。 【参考方案1】:不是每次都附加到列表中,而是使用固定长度预先分配它。然后,当列表已满时,根据 Wikipedia 文章中的描述将其翻倍。这应该会给你你所追求的性能。
foo <- vector("list", 1000)
# populate the list, with N >> 1000...
for(i in seq(N))
foo[[i]] <- ...
# if the list is full, extend it
if(i == length(foo))
foo <- c(foo, vector("list", length(foo)))
【讨论】:
有道理。我想在发布后手动执行此操作,但令我惊讶的是没有明显的内置方式来执行此类操作。为什么 O(N) 行为是默认行为?以上是关于R中的动态类数组结构?的主要内容,如果未能解决你的问题,请参考以下文章