For 循环仅连接最后一次迭代。为什么?

Dut*_*hke 0 for-loop r concatenation

我想要一个带有 excel 字母的向量:c(A, B, C, ... Z, AA, AB, ... AZ, BA, ...)。

我的尝试是这样的:

excel_letters <- LETTERS

for(n in length(LETTERS)){

  excel_letters <- c(excel_letters, paste0(LETTERS[n], LETTERS))

}

Run Code Online (Sandbox Code Playgroud)

由于我在迭代循环之前在循环外部定义 excel_letters,因此我期望获得所需的输出。相反,我只得到:

 [1] "A"  "B"  "C"  "D"  "E"  "F"  "G"  "H"  "I"  "J"  "K"  "L"  "M"  "N"  "O"  "P"  "Q"  "R"  "S"  "T"  "U"  "V"  "W"  "X"  "Y"  "Z"  "ZA" "ZB" "ZC"
[30] "ZD" "ZE" "ZF" "ZG" "ZH" "ZI" "ZJ" "ZK" "ZL" "ZM" "ZN" "ZO" "ZP" "ZQ" "ZR" "ZS" "ZT" "ZU" "ZV" "ZW" "ZX" "ZY" "ZZ"
Run Code Online (Sandbox Code Playgroud)

这基本上是字母加上最后一次迭代。

我在这里缺少什么?

我知道还有其他方法可以解决此问题,但我想知道为什么这不起作用。

Kon*_*lph 5

如前所述,length(LETTERS)是单个元素,因此for (n in length(LETTERS))迭代单个值。

\n

一般来说,您很少需要迭代索引\xc2\xa0\xe2\x80\x94,它\xe2\x80\x99s更容易直接迭代向量中的值:

\n
for (letter in LETTERS) \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

在极少数情况下,您确实需要迭代向量的索引(这里不需要\xe2\x80\x99t),请使用以下模式

\n
for (i in seq_along(the_vector))\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 但对于您的用例,更好的(更短,更具表现力,更高效)解决方案完全避免了循环,有利于直接构造:

\n
excel_letters <- paste0(rep(c("", LETTERS), each = length(LETTERS)), LETTERS)\n
Run Code Online (Sandbox Code Playgroud)\n

您编写 R 的次数越多,您就越会发现矢量化和定制算法如何帮助您避免循环。

\n