簡體   English   中英

嵌套循環有問題 (R)

[英]Having trouble with nested loops (R)

我編寫了這個嵌套循環,以便在內部循環中,代碼貫穿第一行; 然后,外層更新循環以允許內層運行通過第二行(依此類推)。 數據來自矩陣“supergerador”。 “rodadas”是行大小,“n”是列大小。 “vec”是感興趣的向量。 先感謝您!

編輯: i, j 最初被分配 i = 1, j = 2

for(e in 1:rodadas) {
  for(f in 1:(n-1)) {
    if(j >= 10) {
      vec[f] = min(supergerador[i, j] - supergerador[i, j - 1], 1 - supergerador[i, j])
    }
    else {
    vec[f] = func(i, j)
    }
    j = j + 1
  }
  i = i + 1
}

func定義為

func = function(i, j) {
  minf = min(supergerador[i, j] - supergerador[i, j - 1], supergerador[i, j + 1] - supergerador[i, j])
  return(minf)
}

作為參考,這是嵌套循環返回的內容。 你可以說它只經過了一行。

> vec
[1] 0.127387378 0.068119707 0.043472981 0.043472981 0.027431603 0.027431603
[7] 0.015739046 0.008010766 0.008010766

我不太確定您打算在這里做什么,但這里有一些建議和代碼編輯:

建議:

  1. 如果您有一個 for 循環,請為您的子集使用循環索引(盡可能合理),並在合理的情況下避免使用其他索引。
    • 當索引應該被重置但沒有被重置時,這可以避免代碼混亂和不可預見的錯誤。
  2. 盡可能避免雙重子集變量。 例如,如果您多次調用x[i, j] ,請將其存儲在一個變量中,然后在您的結果中使用此變量。
  3. 單行函數很好,但應該增加代碼的可讀性。 否則,從效率的角度來看,內聯代碼是最佳的。

將這些合並到您的代碼中,我相信您正在尋找

for(i in 1:rodadas) {
  for(j in 2:n) {
    x1 = supergerador[i, j]
    x2 = supergerador[i, j - 1]
    if(j >= 10) {
      vec[f] = min(x1 - x2, 1 - x1)
    }
    else {
      vec[f] = min(x1 - x2, supergerador[i, j + 1] - x1)
    }
  }
}

在這里,我假設您希望將每一行的列循環到rodadas

一旦您對 R 更加熟悉,您應該研究一下矢量化。 對您的問題有了更多了解,我們應該可以很容易地向量化您的第二個 for 循環,刪除您的if語句並在 1 次快速掃描中執行計算。 但在那之前,這是一個開始您的編程體驗的好地方,並且對for-loops有深刻的理解對於任何語言都至關重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM