This package provides iterators for combinations, permutations, subsets, and cartesian product, with which one can go through the elements without creating a huge set of all possible values.
Since v1.0.2, the iterator objects of the package inherit the iter class from iterators package. As a result, the objects are also compatible with foreach library.
Install from CRAN:
install.packages("combiter")
Install development version:
devtools::install_github("kota7/combiter")
Import:
library(combiter)
This package provides four iterator classes for integer vectors: icomb, iperm, isubset, and icartes.
icomb(n, k) goes through all combinations of k integers out of 1 to n.iperm(n, k) goes through all permutations of size k consisting of integers 1 to n of size k.isubset(n) goes through all subsets of integers 1 to n.icartes(c(n1, n2, ...)), available for v1.0.2+, goes through cartesian products of 1 to n1, 1 to n2 ….The iterators do not store all possible values inside the object. Instead, they compute the next or previous element on spot. This implementation would be more memory efficient with a large n, since the number of possible cases grows exponentially or even faster for these Combinatorics operations.
x <- icomb(5, 3)
ct <- 0
while (hasNext(x))
{
ct <- ct + 1
i <- nextElem(x)
cat(sprintf("%3d : %s\n", ct, paste0(i, collapse = " ")))
}
## 1 : 1 2 3
## 2 : 1 2 4
## 3 : 1 2 5
## 4 : 1 3 4
## 5 : 1 3 5
## 6 : 1 4 5
## 7 : 2 3 4
## 8 : 2 3 5
## 9 : 2 4 5
## 10 : 3 4 5
x <- iperm(4, 2)
ct <- 0
while (hasNext(x))
{
ct <- ct + 1
i <- nextElem(x)
cat(sprintf("%3d : %s\n", ct, paste0(i, collapse = " ")))
}
## 1 : 1 2
## 2 : 1 3
## 3 : 1 4
## 4 : 2 1
## 5 : 2 3
## 6 : 2 4
## 7 : 3 1
## 8 : 3 2
## 9 : 3 4
## 10 : 4 1
## 11 : 4 2
## 12 : 4 3
x <- isubset(3)
ct <- 0
while (hasNext(x))
{
ct <- ct + 1
i <- nextElem(x)
cat(sprintf("%3d : %s\n", ct, paste0(i, collapse = " ")))
}
## 1 :
## 2 : 1
## 3 : 2
## 4 : 3
## 5 : 1 2
## 6 : 1 3
## 7 : 2 3
## 8 : 1 2 3
x <- icartes(c(3, 4))
ct <- 0
while (hasNext(x))
{
ct <- ct + 1
i <- nextElem(x)
cat(sprintf("%3d : %s\n", ct, paste0(i, collapse = " ")))
}
## 1 : 1 1
## 2 : 1 2
## 3 : 1 3
## 4 : 1 4
## 5 : 2 1
## 6 : 2 2
## 7 : 2 3
## 8 : 2 4
## 9 : 3 1
## 10 : 3 2
## 11 : 3 3
## 12 : 3 4
Each iterator shown above has its value counterpart. For example, ipermv, the value version of iperm, iterates through all permutations of k elements from n values.
x <- ipermv(c("A", "G", "C"), 2)
ct <- 0
while (hasNext(x))
{
ct <- ct + 1
i <- nextElem(x)
cat(sprintf("%3d : %s\n", ct, paste0(i, collapse = " ")))
}
## 1 : A G
## 2 : A C
## 3 : G A
## 4 : G C
## 5 : C A
## 6 : C G
icombv, isubsetv, and icartesv are also defined analogously.
foreach (v1.0.2+)Since v1.0.2, the iterator objects can be used with foreach function from foreach.
library(foreach)
foreach(i = icomb(3, 2)) %do% sum(i)
## [[1]]
## [1] 3
##
## [[2]]
## [1] 4
##
## [[3]]
## [1] 5