Попробуйте это:
perms <- function(vec) {
f <- function(v0) unlist(sapply(seq_along(v0)[-1], function(i) {
apply(combn(v0, i), 2, paste0, collapse="")
}))
c(vec, f(vec), f(rev(vec)))
}
unique(c(sapply(1:2, function(i) apply(m, i, perms))))
# [1] "b" "a" "t" "ba" "bt" "at" "bat" "ta" "tb" "ab" "tab" "c"
# [13] "z" "o" "cz" "co" "zo" "czo" "oz" "oc" "zc" "ozc" "q" "d"
# [25] "p" "qd" "qp" "dp" "qdp" "pd" "pq" "dq" "pdq" "bc" "bq" "cq"
# [37] "bcq" "qc" "qb" "cb" "qcb" "az" "ad" "zd" "azd" "dz" "da" "za"
# [49] "dza" "to" "tp" "op" "top" "po" "pt" "ot" "pot"
Вот как это работает.
apply
принимает матрицу (m
), ось (1
это "строки", 2
это "столбцы) и функцию (perms
):
apply(m, 1, perms)
# [,1] [,2] [,3]
# [1,] "b" "c" "q"
# [2,] "a" "z" "d"
# [3,] "t" "o" "p"
# [4,] "ba" "cz" "qd"
# [5,] "bt" "co" "qp"
# [6,] "at" "zo" "dp"
# [7,] "bat" "czo" "qdp"
# [8,] "ta" "oz" "pd"
# [9,] "tb" "oc" "pq"
# [10,] "ab" "zc" "dq"
# [11,] "tab" "ozc" "pdq"
Он транспонирует вывод (это R, вздох), поэтому каждая строка (из 1
) возвращается в виде столбца. Мы хотим запустить эту функцию как по строкам, так и по столбцам, поэтому мы также делаем
apply(m, 2, perms)
Я был (задним числом, "к сожалению") хитрым, используя sapply
для итерации по осям, заданным apply
. Следующие два достаточно похожи (по содержанию, если не точная структура):
c(apply(m,1,perms), apply(m,2,perms))
sapply(1:2, function(i) apply(m, 1, perms))
Возможно, это просто запутывает вещи ...
Последняя часть - unique(...)
, которая просто удаляет дубликаты.