R中的双For循环

12 loops r

你如何for在R中正确编写双循环?

例如,在CI中会这样做

int i, j;
for (i = 1; i < 6; i++) {
    for (j=i; j <= 3; j++) {
        printf("%i,%i\n",i,j);
    }
    // Do more operations for i > 3...
}
Run Code Online (Sandbox Code Playgroud)

这将生成(人工)序列:

1,1
1,2
1,3
2,2
2,3
3,3
Run Code Online (Sandbox Code Playgroud)

在R中,写入时不会出现相同的行为

for (i in 1:6) {
    for (j in i:3) {
        print(paste(i,j,sep=","))
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我已经沦落到做类似的事情

for (i in 1:6) {
    j <- i
    while (j <= 3) {
        print(paste(i,j,sep=","))
        j <- j+1
    }
}       
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

正如Shane所说,也许我应该说清楚:我对代码式数学匹配特别感兴趣,以便学生更容易理解.看来学生们最熟悉的是for循环.

特别是,我希望我的学生模拟LIBOR市场模型.在相同的概率测度下模拟前向速率的动态.因此,对于每个时间步长和每个前向速率,需要计算和添加适当的漂移校正\ mu_i.

Sha*_*ane 12

很抱歉询问什么是可能是一个愚蠢的问题,但在什么意义上R不能这样做?这对我来说非常好:

N <- 5
for (i in 0:(2*N)) {
   for (j in i:N) {
        print(paste(i,j,sep=","))
    }
}
Run Code Online (Sandbox Code Playgroud)

难道你只是没有在序列的末尾放括号吗?

编辑: 我明白了...你想强制执行序列i:3总是<= 3?我认为无论是序列还是for语句的子句都不可能.你可以在循环中设置一个中断,但这并不比你当前的方法更好:

for (i in 1:6) {
    for (j in i:3) {
        if(j > 3) break()
        print(paste(i,j,sep=","))
    }
}  
Run Code Online (Sandbox Code Playgroud)

这是在没有for循环的情况下生成此序列的另一种方法:

x <- cbind(rep(c(1,2,3), 3),
    rep(c(1,2,3), each=3))
Run Code Online (Sandbox Code Playgroud)

或者使用expand.grid(根据Dirk的建议):

x <- expand.grid(x=1:3, y=1:3)
Run Code Online (Sandbox Code Playgroud)

然后删除不需要的案例:

x[x[,1] >= x[,2],]
Run Code Online (Sandbox Code Playgroud)

编辑2:这可能不适合您的需求,但我相信Quantlib有一个Libor市场模型实施.我不确定它是否暴露在RQuantlib中.


Dir*_*tel 10

你当然可以嵌套循环:

R> for (i in 1:3) for (j in 1:3) cat(i,j,i*j, "\n")
1 1 1 
1 2 2 
1 3 3 
2 1 2 
2 2 4 
2 3 6 
3 1 3 
3 2 6 
3 3 9 
R> 
Run Code Online (Sandbox Code Playgroud)

一般意义上你不应该像矢量化调用更容易读写:

R> outer(1:3,1:3, "*")
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9
R> 
Run Code Online (Sandbox Code Playgroud)

但如果使用nexted循环更容易开发,那么就这样做.

对于"依赖于第一个索引的第二个索引"问题,您可以使用lower.tri(),upper.tri()或索引来实现这一目标.

R> X <- expand.grid(x=1:3, y=1:3)
R> X <- X[ X$x >= X$y, ]
R> outer(X$x, X$y, "*")
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    2    2    3
[2,]    2    2    2    4    4    6
[3,]    3    3    3    6    6    9
[4,]    2    2    2    4    4    6
[5,]    3    3    3    6    6    9
[6,]    3    3    3    6    6    9
R> 
Run Code Online (Sandbox Code Playgroud)


Rob*_*man 6

这里的问题i:3是有意义的时候i>3.例如,5:3给出(5,4,3).您只需要一个简单的if语句来阻止第二个循环运行i>3.

for (i in 1:6) {
    if(i < 4) {
        for (j in i:3) {
            print(paste(i,j,sep=","))
        }
    }
    # Do more operations for i > 3...
}
Run Code Online (Sandbox Code Playgroud)

但是,如果可能,请尝试避免显式循环.Dirk和Shane的答案提供了一些关于如何做到这一点的想法.