as.function.permutation()
in the permutations package:
group actions## function (x, ...)
## {
## a <- NULL
## x <- as.matrix(as.word(x))
## if (nrow(x) == 1) {
## return(as.function(alist(a = , x[, a])))
## }
## else {
## return(as.function(alist(a = , x[cbind(seq_len(nrow(x)),
## a)])))
## }
## }
## <bytecode: 0x64414f1c07b0>
## <environment: namespace:permutations>
To cite the permutations package in publications, please use Hankin (2020). The
permutations
package was intended to manipulate and combine
permutations, but often one wants to consider the effect of a
permutation on the underlying set, taken to be \(\left[n\right]=\left\lbrace
1,2,\ldots,n\right\rbrace\). In other words, we wish to consider
a permutation as a function. In package idiom, coercing a permutation to
a function is straightforward:
## [1] 5
Above we see that permutation \((45)(127)\) maps 4 to 5. We can see from
the function body, at the top of the page, that permutations are coerced
to word form. Function as.function.permutation()
uses
as.matrix()
to stop “x[a,]
” dispatching to
[.word()
and use matrix extraction instead. It might be
argued that unclass()
would be better coding.
Coercion is vectorized:
## [1] 2 7 3 5 4 6 1
## [1] 3 4 2 4 2 3 3 4 1 4 1 3 2 4 1 4 1 2 2 3 1 3 1 2
## [1] 6 2 2 7 3 2 2
The second and third forms use the
alist(a = , x[cbind(seq_len(nrow(x)),a)])
construction. We
now discuss the extent to which the underlying permutation group is
represented in package idiom. Consider the following construction:
## [1] (12)
## Error in x[, a]: subscript out of bounds
On the one hand, object p
is a permutation on the set
\([2]=\left\lbrace 1,2\right\rbrace\).
The action of this permutation on 3 is not defined, and the package
returns an error. Above we effectively see
## Error in t(1:2)[, 3]: subscript out of bounds
which is the origin of the error. On the other hand, one might
reasonably hold that the action of \((12)\) on 3 should be 3, on the grounds
that \((12)\) transposes elements 1 and
2 and leaves all other elements unchanged. To realise this
interpretation we need to ensure that p
has underlying set
including 3, in this case \(\left\lbrace
1,2,3\right\rbrace\). This is straightforward with
as.word()
:
## [1] 3
The ever-problematic identity permutation acts on the empty set so its functionalization always returns an error:
## Error in x[, a]: subscript out of bounds
Again the resolution is to coerce to word form with explicit
n
:
## [1] 4