# Classes and methods to deal with cell references

#### 2016-07-25

Following Testoft’s book Spreadsheet Implementation Technology: Basics and Extensions.

The main class is ra_ref which holds a single relative, absolute, or mixed cell reference. Two logical indicators, rowAbs and colAbs, which report whether the row (column) reference is absolute. Also integers rowRef and colRef, which either hold absolute row and column or, for a relative reference, an offset.

Two other very convenient, but less general forms for holding cell references:

• as a string
• in A1 format: e.g. B4, B$4, $B4, $B$4 (let’s assume found in cell D5, shall we?)
• in R1C1 format: e.g. R[1]C[-2], R4C[-2], R[1]C2, R4C2
• as an absolute row and colum address

to_string.ra_ref() converts a single ra_ref to character.
as.ra_ref.character() converts a single cell reference in string form to a ra_ref object.

Note there can be problems converting to/from character, specifically A1 formatted strings, because we don’t know the host cell. A relative row or column reference cannot be resolved without knowing the host cell. So this is a source of warnings and NA, going both directions.

The cell_addr class is for absolute cell addresses. It’s a list with two synchronized, equal length integer vectors, row and col. It could be a data frame or matrix (and mabye it should be?), but it’s not. Methods [, [[, and length exist. Note that a single cell_addr object could hold many absolute references.

to_string.cell_addr converts a cell_addr object to character, in a vectorized way. The format fo is an argument. Under the hood, this actually converts each individual cell address into an ra_ref object, then calls to_string on it, and returns them as character vector.

as.ra_ref.cell_addr converts a cell_addr object to a ra_ref object and is NOT vectorized.

WIP!