Disordered indices with the disordR package: an introduction to class disindex
Author: Robin Hankin
Date: 2023-03-22

# 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 01ab50f7b60c5434cefefe1baffbcacf47832d68 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 01ab50f7b60c5434cefefe1baffbcacf47832d68 and elements
    ## [1] 4 6 1 2 3 4 5 1
    ## (in some order)

    d[ind]

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

    d[ind] <- 99
    d

    ## A disord object with hash e558b6fa5c7e25640479209484703e60455f70ae 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 01ab50f7b60c5434cefefe1baffbcacf47832d68 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 a6152d8b6a23cc9e00ff2403dcf2836e11f996c8 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