有没有办法引用向量的结尾?

时间:2014-08-04 22:17:58

标签: r vector

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

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

但我不知道我是什么,我无法将矢量保存在记忆中。

有没有办法可以引用矢量的长度,比如

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

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

我知道长度,头部和尾部的功能,而vec [ - (1:99)]是一个等价的表达式。

但是,我实际上想知道是否有一些引用将从指定的数字运行迭代到'结束'矢量。

谢谢!

2 个答案:

答案 0 :(得分:2)

我可能不理解你的问题。如果这不是有用的,请告诉我,我将删除它。

我想收集你想要从任意长度的向量中提取元素,从元素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

这两个都创建(暂时)随机长度(&gt; = 5)的整数序列,并将元素从5提取到结尾而不进行自引用。

答案 1 :(得分:0)

你曾经多次提到记忆。如果您关注内存并分配大型对象,则应该查看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有关它可以帮助节省内存 这是L电话结束时rep.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个字节的内存,直到它被首次评估。