在 R 中正确存储 while 循环结果

Properly store while loop result in R

提问人:fredi96 提问时间:4/6/2023 更新时间:4/6/2023 访问量:35

问:

我有三个向量:

N <- c(213,214,215,216)
R <- c(0.11937253,0.11937253, 0.11937253,0.11937253)
P <- c(0.549252447, 0.549252447, 0.549252447, 0.549252447)

从这个向量中,我试图使用带有嵌套 while 循环的自定义函数来获得结果:

tmp <- function(N,R,P) {
err <- c()
i = 2
while ((N[i-1]+R[i-1]+P[i-1]) < 220) {
if (is.na(N[i])) {
break {
} else {
err <- N[i]/(R[i]+P[i])
i = i + 1
print(err)
  }
}

重点是存储 .使用我可以正确地看到我的结果(它应该是一个向量),但是当我使用 R 时,我只给了我迭代的第一个元素。如何获得正确的输出?它应该是一个向量,包含来自迭代的所有元素。errprintreturn

KBK公司不要关注条件,它只是一个代理,真正的代理是另一个,但我检查了一下,那里没有问题。此外,我构建了一个 if 语句,因为 while 循环的条件非常罕见,并且可能永远不会发生,并且会永远迭代。

r while循环

评论

0赞 DaveArmstrong 4/6/2023
相反,你需要。从本质上讲,您需要保留所有以前的结果并添加另一个结果。逐个元素的建筑元素。err <- c(err, N[i]/(R[i]+P[I]))err
0赞 fredi96 4/6/2023
我应该把它放在最后 2 个大括号之前吗?
0赞 Dimitri 4/6/2023
不,您应该将其放在零件中,而不是 ,然后在最后一个括号之前。原因是在初始代码中只是擦除 err 的先前值,而不是添加新值。elseerr <- N[i]/(R[i]+P[i])return(err)err <- N[i]/(R[i]+P[I])

答:

1赞 DaveArmstrong 4/6/2023 #1

该函数将结果发送到控制台,但不会以任何其他方式保存它。您需要结合评论中建议的内容。您需要不断添加到每个迭代中,然后在函数结束时返回它。print()err

N <- c(213,214,215,216)
R <- c(0.11937253,0.11937253, 0.11937253,0.11937253)
P <- c(0.549252447, 0.549252447, 0.549252447, 0.549252447)


tmp <- function(N,R,P) {
  err <- c()
  i = 2
  while ((N[i-1]+R[i-1]+P[i-1]) < 220) {
    if (is.na(N[i])) {
      break 
      } else {
        e <- N[i]/(R[i]+P[i])
        err <- c(err, e)
        i = i + 1
        print(e)
        }
  }
  return(err)
}

out <- tmp(N, R, P)
#> [1] 320.0598
#> [1] 321.5554
#> [1] 323.051

out
#> [1] 320.0598 321.5554 323.0510

创建于 2023-04-06 使用 reprex v2.0.2

0赞 Merijn van Tilborg 4/6/2023 #2
tmp <- function(N, R, P) {
  s <- N + R + P
  i <- which(s < 220)
  (N[i] / (R[i] + P[i]))[-1]
}

tmp(N, R, P)

# [1] 320.06 321.56 323.05