# Disordered indices with the `disordR` package: an introduction to class `disindex`

#### Robin Hankin

#### 2023-03-22

Experimental `S4` class `disindex` allows extraction methods, including list extraction, to operate with the output of `which()`. Consider the following R session:

    library("disordR")
    (d <- disord(c(4,6,1,2,3,4,5,1)))

    ## A disord object with hash 4fda2c4037c8f9644dfa816ef7603f573cca0e4b and elements
    ## [1] 4 6 1 2 3 4 5 1
    ## (in some order)

    ind <- which(d>4)

Above, object `ind` points to those elements of `d` which exceed 4. Thus:

    d

    ## A disord object with hash 4fda2c4037c8f9644dfa816ef7603f573cca0e4b and elements
    ## [1] 4 6 1 2 3 4 5 1
    ## (in some order)

    d[ind]

    ## A disord object with hash 49b7c198fc867500dd2d8bf5da545e98e07fa258 and elements
    ## [1] 6 5
    ## (in some order)

    d[ind] <- 99
    d

    ## A disord object with hash 88cb8d45f9bb47bb55ebe68011cff8f4957e48a9 and elements
    ## [1]  4 99  1  2  3  4 99  1
    ## (in some order)

However, we cannot assert that `ind` is elements 2 and 7 of `d`, for the elements of `d` are stored in an implementation-specific order. If we examine `ind` directly, we see:

    ind

    ## A disind object with hash 4fda2c4037c8f9644dfa816ef7603f573cca0e4b and 2 (implementation-specific) elements

which correctly says that the elements of `ind` are implementation-specific. However, the main application of `disindex` objects is for list extraction.

    d <- disord(c(4,1,6,2))
    dl <- sapply(d,function(x){seq(from=5,to=x)})
    dl

    ## A disord object with hash 24a14fc386b89f4531d21bb93b29fa65a2102be3 and elements
    ## [[1]]
    ## [1] 5 4
    ##
    ## [[2]]
    ## [1] 5 4 3 2 1
    ##
    ## [[3]]
    ## [1] 5 6
    ##
    ## [[4]]
    ## [1] 5 4 3 2
    ##
    ## (in some order)

Suppose I wish to extract from object `dl` just the element with the longest length. Noting that this would be a `disord`-compliant question, we would use:

    howlong <- unlist(lapply(dl,length))
    longest <- which(howlong == max(howlong))
    dl[[longest]]

    ## [1] 5 4 3 2 1