如何在R编程中扩展循环n次?

How to expand loop n times in R programming?

我有一个字符向量 'A'、'B'、'C'、'D',我想循环 n 次以获得所有可能的组合 (4^n ) 的字符。如何编写一个函数来执行这个给定的输入 n?

例如,如果 n=2,我的循环将如下所示:

string <- c('A','B','C','D')
combination = c()
count = 1
for (j in string) {
  for (k in string) {
    combination[count] <- paste0(j,k)
    count = count + 1
  }
}

这将产生:

> combination
 [1] "AA" "AB" "AC" "AD" "BA" "BB" "BC" "BD" "CA" "CB" "CC" "CD" "DA" "DB" "DC" "DD"

如果 n=3,代码将是这样的:


combination = c()
count = 1
for (j in string) {
   for (k in string) {
       for (l in string) {
           combination[count] <- paste0(j,k,l)
           count = count + 1
        }
    }
}

产生

> combination
 [1] "AAA" "AAB" "AAC" "AAD" "ABA" "ABB" "ABC" "ABD" "ACA" "ACB" "ACC" "ACD" "ADA" "ADB" "ADC" "ADD" "BAA" "BAB" "BAC"
[20] "BAD" "BBA" "BBB" "BBC" "BBD" "BCA" "BCB" "BCC" "BCD" "BDA" "BDB" "BDC" "BDD" "CAA" "CAB" "CAC" "CAD" "CBA" "CBB"
[39] "CBC" "CBD" "CCA" "CCB" "CCC" "CCD" "CDA" "CDB" "CDC" "CDD" "DAA" "DAB" "DAC" "DAD" "DBA" "DBB" "DBC" "DBD" "DCA"
[58] "DCB" "DCC" "DCD" "DDA" "DDB" "DDC" "DDD"

一句话,递归:

#' n: length of each combination string
#' basis: the starting vector of characters to combine
#' extras: the vector of characters to be combined with basis.  Defaults to basis
#' i: The current depth of recursion.  Users should generally not need to access
#' this parameter. 
combine <- function(n, basis=c('A','B','C','D'), extras=basis, i=1) {
  x <- expand.grid(basis, extras)
  y <- paste0(x$Var1, x$Var2)
  if (i == n-1) {
    return(y)
  } else {
    return(combine(n, y, extras, i+1))
  }
}

给予,例如,

> combine(2)
 [1] "AA" "BA" "CA" "DA" "AB" "BB" "CB" "DB" "AC" "BC" "CC" "DC" "AD" "BD" "CD" "DD"

> combine(3)
 [1] "AAA" "BAA" "CAA" "DAA" "ABA" "BBA" "CBA" "DBA" "ACA" "BCA" "CCA" "DCA" "ADA" "BDA" "CDA" "DDA" "AAB" "BAB" "CAB" "DAB" "ABB" "BBB" "CBB" "DBB" "ACB" "BCB" "CCB"
[28] "DCB" "ADB" "BDB" "CDB" "DDB" "AAC" "BAC" "CAC" "DAC" "ABC" "BBC" "CBC" "DBC" "ACC" "BCC" "CCC" "DCC" "ADC" "BDC" "CDC" "DDC" "AAD" "BAD" "CAD" "DAD" "ABD" "BBD"
[55] "CBD" "DBD" "ACD" "BCD" "CCD" "DCD" "ADD" "BDD" "CDD" "DDD"

等等

如果更需要其他顺序,请随意对输出进行排序。