0

我试图用一个没有任何成功的简单命令替换这个循环(lapply?rapply?mapply?)。也许在 R 中确实需要循环是一种罕见的情况?

n <- 10
x <- vector(mode="numeric", length=n)

for(i in 2:n) {
    x[i] <- x[i-1]+runif(1)
}

我的问题表述得很糟糕。这些回答帮助我理解了我真正需要的是把一个向量的值访问到一个函数中。使用对于任何函数“f”来说都很简单的循环,我们可以计算出:

x <- c(1,2,3,4)
for(i in 2:4) {
    x[i] <- f(x[i-1])
}

也许唯一的方法是全局变量?

4

4 回答 4

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
于 2014-06-27T12:28:16.503 回答
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
于 2014-06-27T12:27:24.837 回答
1

你可以使用 sapply 之类的

c(x[1],(sapply(x,function(a){a+runif(1)})[-length(x)]))
于 2014-06-27T12:25:23.153 回答
1

实现此目的的另一种方法是使用Reduce

f <- function(a, b) a + runif(1)  
x <- Reduce(f, x, accumulate = TRUE)

(只是建议这是一个通用的替代方案;cumsum其他答案的方式更快)

于 2014-06-27T12:30:34.307 回答