【问题标题】:Is there a way to refer to the end of a vector?有没有办法引用向量的结尾?
【发布时间】:2014-08-04 22:17:58
【问题描述】:

我不想为我的一些计算保存巨大的中间结果,因此想在不保存这些内存昂贵的向量的情况下运行一些测试。

说,在计算过程中,我有一个任意长度为 l 的向量。

但是我不知道l是什么,也无法将向量保存在内存中。

有没有办法可以参考向量的长度,比如

vec[100:END] or vec[100:-1] or vec[100:last]

请注意这里的vec不是变量,它只是指一个中间表达式,它会输出一个向量。

我知道长度、头和尾函数,并且 vec[-(1:99)] 是一个等价的表达式。

但是,我实际上想知道是否有一些参考可以运行从指定数字到向量“结束”的迭代。

谢谢!!

【问题讨论】:

  • 不太明白为什么这不是答案:vec[100:length(vec)]
  • 这是一个答案,但不是想要的答案。 “我实际上想知道是否有一些参考可以运行从指定数字到向量'结束'的迭代。”我不想计算length(vec)
  • @Shambho:那么答案是“不”。
  • 在处理向量时,您的字面问题的答案是“否”,但这并不意味着没有其他方法可以处理它。也许您设想创建此数据的方式需要重新审视,其中“矢量”不是理想的机制。例如,也许您需要编写一个函数来计算每个数据并允许您(调用者)指定起点(例如,默认为 1)。
  • 为什么不能将向量保存在内存中?它是如何创建的,你想用它做什么?

标签: r vector


【解决方案1】:

我可能不明白你的问题。如果这没有用,请告诉我,我会删除它。

我猜你想从任意长度的向量中提取元素,从元素 N 到末尾,而不显式存储向量(如果你想使用,这是必需的,例如length(vec))。这里有两种方法:

N <- 5    # grab element 5 to the end.
set.seed(12)
(1:sample(N:100,1))[-(1:(N-1))]
# [1]  5  6  7  8  9 10 11

set.seed(12)
tail(1:sample(N:100,1),-(N-1))
# [1]  5  6  7  8  9 10 11

这两者都(临时)创建了一个随机长度 (>=5) 的整数序列,并从 5 到末尾提取元素而不进行自引用。

【讨论】:

  • 在上面弹出rev(x)[1],只是为了好玩。
  • @RichardScriven 得到的是最后一个元素的值,不是吗?我认为 OP 想要一个包含从给定索引到最后一个元素的元素的向量??
【解决方案2】:

你多次提到记忆。如果您担心内存和分配大对象,您应该查看Memory-limits 文档和相关链接。首先,对R语言的操作是有办法的。这里我只分配一个对象,函数f,并使用它而不做任何其他的分配。

> f <- function(x, y) x:y   ## actually, g <- ":" is only 96 bytes
> object.size(f)
# 1560 bytes
> f(5, 20)[3:7]
# [1]  7  8  9 10 11
> object.size(f)
# 1560 bytes
> f(5, 20)[3:length(f(5, 20))]
# [1]  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> object.size(f)
# 1560 bytes

您还可以使用expression 来保存未评估的函数调用。

> e <- expression(f(5, 20))  ## but again, g <- ":" is better
> eval(e)
# [1]  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
> eval(e)[6:9]
# [1] 10 11 12 13
> eval(e)[6:length(eval(e))]
# [1] 10 11 12 13 14 15 16 17 18 19 20
> rev(eval(e))
# [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5

根据您使用的数据类型,有多种方法可以 避免在会话期间使用大量内存。这里有一些相关的 你的问题。

memory.profile()
gc()
#          used (Mb) gc trigger (Mb) max used (Mb)
# Ncells 274711 14.7     531268 28.4   531268 28.4
# Vcells 502886  3.9    1031040  7.9   881084  6.8

?gc() 是很好的知识,我无法真正解释。最好读 关于它。另外,我刚刚了解了 memCompress() 和 memDecompress() 内存压缩/存储。这里是一个看看另外,如果你正在使用 整数值,通知 R 可以帮助节省内存。
这就是Lrep.int() 调用结束时的用途。

x <- rep.int(5L, 1e4L)
y <- as.raw(x)
z1 <- memCompress(y)
z2 <- memCompress(y, "b")
z3 <- memCompress(y, "x")

mapply(function(a) object.size(get(a)), c('x','y','z1','z2','z3'))
#     x     y    z1    z2    z3 
# 40040 10040    88    88   168 

还有

delayedAssign("p", rep.int(5L, 1e5L))

这是一个promise object,在第一次评估之前占用 0 字节的内存。

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 2021-10-27
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多