R for循环中的变量通过边界

时间:2015-01-25 23:46:01

标签: r

我有一个简单的功能如下

strange_function <- function(s, e) {
  for (i in s : e) {
    for (j in i - s + 1 : i) {
      print(c(i,j))
    }
  }
  return
}

使用

调用此函数时
strange_function(2,10)

我注意到前几个输出为

[1] 2 1
[1] 2 2
[1] 3 2
[1] 3 3
[1] 3 4

最后一个显然是错误的。这是一个错误吗? 感谢

2 个答案:

答案 0 :(得分:3)

在R终端试试这个:

> 3-2+1:3
[1] 2 3 4

您可以看到它正在做的是首先创建一个向量1:3,然后添加3并将2减去每个元素。我怀疑你想要的是(i-s+1):i

您还可以通过多种方式简化此代码,例如:

strange_function <- function(s, e) {
 i<-rep(s:e,each=2)
 j<-c(s-1,rep(s:(e-1),each=2),e)
 print(data.frame(i,j))
}

对于大型载体,此方法也明显更快。例如strange_function(2,1000)

我的版本:

   user  system elapsed
  0.024   0.007   0.031

您的版本(带有固定括号):

   user  system elapsed
  0.146   0.046   0.207

答案 1 :(得分:0)

你想要一些带有j循环的括号吗?这条线

for (j in i - s + 1 : i)应为for (j in (i - s + 1) : i)

strange_function <- function(s, e) {
  for (i in s : e) {
    for (j in (i - s + 1) : i) {
      print(c(i,j))
    }
  } 
}

> strange_function(2,10)
[1] 2 1
[1] 2 2
[1] 3 2
[1] 3 3
[1] 4 3
[1] 4 4
[1] 5 4
[1] 5 5
[1] 6 5
[1] 6 6
[1] 7 6
[1] 7 7
[1] 8 7
[1] 8 8
[1] 9 8
[1] 9 9
[1] 10  9
[1] 10 10