Предположим, у нас есть следующие перестановки букв "a", "b" и "c":
library(combinat)
do.call(rbind, permn(letters[1:3]))
# [,1] [,2] [,3]
# [1,] "a" "b" "c"
# [2,] "a" "c" "b"
# [3,] "c" "a" "b"
# [4,] "c" "b" "a"
# [5,] "b" "c" "a"
# [6,] "b" "a" "c"
Возможно ли выполнить некоторую функцию для данной перестановки "на -the-fly "(т.е. конкретная строка) без сохранения результата?
То есть, если row == "a" "c" "b"
или row == "b" "c" "a"
, не сохраните результат. В этом случае желаемый результат будет:
# [,1] [,2] [,3]
# [1,] "a" "b" "c"
# [2,] "c" "a" "b"
# [3,] "c" "b" "a"
# [4,] "b" "a" "c"
Я знаю, что могу применить функцию ко всем перестановкам на лету в пределах combinat::permn
с аргументом fun
, таким как:
permn(letters[1:3], fun = function(x) {
res <- paste0(x, collapse = "")
if (res == "acb" | res == "bca") {
return(NA)
} else {
return(res)
}
})
Но в этом кадре хранится NA
, и возвращенный список содержит 6 элементов вместо желаемых 4 элементов:
# [[1]]
# [1] "abc"
#
# [[2]]
# [1] NA
#
# [[3]]
# [1] "cab"
#
# [[4]]
# [1] "cba"
#
# [[5]]
# [1] NA
#
# [[6]]
# [1] "bac"
Примечание. Меня не интересует последующее удаление значений NA
; Я особенно заинтересован в том, чтобы не добавлять список результатов «на лету» для данной перестановки.