我试图通过一个symple命令替换这个循环而没有任何成功(lapply?rapply?mapply?)。也许在R中一个罕见的情况是真的需要循环吗?
n <- 10
x <- vector(mode="numeric", length=n)
for(i in 2:n) {
x[i] <- x[i-1]+runif(1)
}
我的问题制定得很糟糕。回复帮助我理解我实际需要的是将向量的值访问到函数中。使用一个对任何函数都很简单的循环&#34; f&#34;我们可以计算出来:
x <- c(1,2,3,4)
for(i in 2:4) {
x[i] <- f(x[i-1])
}
也许唯一的方法是全局变量?
答案 0 :(得分:3)
对于您的确切问题,您根本不需要apply
功能,因为您可以使用cumsum
进行矢量化:
您的代码:
n <- 10
x <- vector(mode="numeric", length=n)
set.seed(1)
for(i in 2:n) {
x[i] <- x[i-1]+runif(1)
}
x
[1] 0.0000000 0.2655087 0.6376326 1.2104859 2.1186937 2.3203756 3.2187653 4.1634406 4.8242384
[10] 5.4533524
我的代码:
set.seed(1)
c(0, cumsum(runif(n-1)))
[1] 0.0000000 0.2655087 0.6376326 1.2104859 2.1186937 2.3203756 3.2187653 4.1634406 4.8242384
[10] 5.4533524
答案 1 :(得分:2)
您可以使用cumsum
。因此,只需将随机变量向量
n <- 10
x <- vector(mode="numeric", length=n)
rData <- runif(9)
for(i in 2:n) {
x[i] <- x[i-1]+rData[i-1]
}
identical(c(0, cumsum(rData)), x)
> identical(c(0, cumsum(rData)), x)
[1] TRUE
答案 2 :(得分:1)
您可以像
一样使用蓝宝石c(x[1],(sapply(x,function(a){a+runif(1)})[-length(x)]))
答案 3 :(得分:1)
实现这一目标的另一种方法是使用Reduce
:
f <- function(a, b) a + runif(1)
x <- Reduce(f, x, accumulate = TRUE)
(只是建议这是一个通用的替代方案;其他答案中的cumsum
方式更快)