【问题标题】:How can I change the value of the argument used in the 'for' loop?如何更改“for”循环中使用的参数的值?
【发布时间】:2013-08-26 23:32:36
【问题描述】:

使用forwhile的组合,我的问题和这个例子类似:我想给向量x的第一个元素加1,跳过元素2:4,第五个元素加1直到到向量 x 的末尾。

j <- 0
x <- c(rep(1, 4), 5:7)

for (i in 1:length(x)){
  x[i] <- x[i] + 1 
  while (j == 0){
    i <- i + 1
    if(x[i] != 1) j <- 1
    print(paste('in:', i))
  }
print(paste('out:', i))
}

结果表明 i 值没有变化。是否可以在 R 中更改它?

[1] "in: 2"
[1] "in: 3"
[1] "in: 4"
[1] "in: 5"
[1] "out: 5"  # look!!!
[1] "out: 2"
[1] "out: 3"
[1] "out: 4"
[1] "out: 5"
[1] "out: 6"
[1] "out: 7"

【问题讨论】:

  • ?"for" 在详细信息部分对此进行了解释
  • 感谢@baptiste!我不知道可以使用?“for”!!!我刚试过 ?for...
  • 仅供参考,这与全局或局部变量无关。
  • tks @hadley。我编辑了问题。
  • @baptiste,你的评论我解决了这个问题。

标签: r for-loop while-loop global-variables


【解决方案1】:

为什么不简单

x + rep(c(1,0,0,0), length.out=length(x))

?

如果您不介意回收警告,请使用:x + c(1,0,0,0)

【讨论】:

  • tks @Ferdinand.kraft。但是,正如我在问题中提到的,我真正的问题是基于“for”循环的使用。这只是一个示例,表明我想更改 'for' 参数的值。
【解决方案2】:

有了@baptiste 的评论,我解决了这个问题。正如帮助信息所述:“next 停止当前迭代的处理并推进循环索引”。给出示例的一种解决方案:

j <- 0
x <- c(rep(1, 4), 5:7)

for (i in 1:length(x)){
  if (x[i] == 1 & j == 0){
    x[i] <- x[i] + 1 
    j <- 1
    next
  } 
  if (x[i] == 1) next
  x[i] <- x[i] + 1 
}

x

[1] 2 1 1 1 6 7 8

【讨论】:

    【解决方案3】:

    或者没有警告

    x <- c(rep(1, 4), 5:7)
    increment.position <- seq(1, length(x), by = 5)
    x[increment.position] <- x[increment.position] + 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 2020-10-30
      • 2019-07-25
      • 1970-01-01
      相关资源
      最近更新 更多