| Title: | Translate Spreadsheet Cell Ranges to Rows and Columns |
| Version: | 1.1.0 |
| Description: | Helper functions to work with spreadsheets and the "A1:D10" style of cell range specification. |
| Depends: | R (≥ 3.0.0) |
| License: | MIT + file LICENSE |
| LazyData: | true |
| URL: | https://github.com/rsheets/cellranger |
| BugReports: | https://github.com/rsheets/cellranger/issues |
| Suggests: | covr, testthat (≥ 1.0.0), knitr, rmarkdown |
| RoxygenNote: | 5.0.1.9000 |
| VignetteBuilder: | knitr |
| Imports: | rematch, tibble |
| NeedsCompilation: | no |
| Packaged: | 2016-07-26 06:50:00 UTC; jenny |
| Author: | Jennifer Bryan [cre, aut], Hadley Wickham [ctb] |
| Maintainer: | Jennifer Bryan <jenny@stat.ubc.ca> |
| Repository: | CRAN |
| Date/Publication: | 2016-07-27 03:17:48 |
cellranger
Description
Helper functions to work with spreadsheets and the "A1:D10" style of cell range specification.
Convert cell reference strings from A1 to R1C1 format
Description
Convert cell reference strings from A1 to R1C1 format. Strictly speaking,
this only makes sense for absolute references, such as "$B$4". Why?
Because otherwise, we'd have to know the host cell of the reference. Set
strict = FALSE to relax and treat pure relative references, like
("B4"), as if they are absolute. Mixed references, like
("B$4"), will always return NA, no matter the value of
strict.
Usage
A1_to_R1C1(x, strict = TRUE)
Arguments
x |
character vector of cell references in A1 format |
strict |
logical, affects reading and writing of A1 formatted cell
references. When |
Value
character vector of absolute cell references in R1C1 format
Examples
A1_to_R1C1("$A$1")
A1_to_R1C1("A1") ## raises a warning, returns NA
A1_to_R1C1("A1", strict = FALSE) ## unless strict = FALSE
A1_to_R1C1(c("A1", "B$4")) ## raises a warning, includes an NA, because
A1_to_R1C1(c("A1", "B$4"), strict = FALSE) ## mixed ref always returns NA
Convert R1C1 positioning notation to A1 notation
Description
Convert cell reference strings from R1C1 to A1 format. This only makes sense
for absolute references, such as "R4C2". Why? Because otherwise, we'd
have to know the host cell of the reference. Relative and mixed references,
like ("R[3]C[-1]" and "R[1]C5"), will therefore return
NA.
Usage
R1C1_to_A1(x, strict = TRUE)
Arguments
x |
vector of cell positions in R1C1 notation |
strict |
logical, affects reading and writing of A1 formatted cell
references. When |
Value
character vector of absolute cell references in A1 notation
Examples
R1C1_to_A1("R1C1")
R1C1_to_A1("R10C52", strict = FALSE)
R1C1_to_A1(c("R1C1", "R10C52", "RC4", "R[-3]C[9]"))
Get column from cell location or reference
Description
Get column from cell location or reference
Usage
addr_col(x, ...)
## S3 method for class 'cell_addr'
addr_col(x, ...)
Arguments
x |
a suitable representation of cell(s) or a cell area reference |
... |
further arguments passed to or from other methods |
Value
integer vector
Methods (by class)
-
cell_addr: Method forcell_addrobjects (ca <- cell_addr(1:4, 3)) addr_col(ca)
Get row from cell location or reference
Description
Get row from cell location or reference
Usage
addr_row(x, ...)
## S3 method for class 'cell_addr'
addr_row(x, ...)
Arguments
x |
a suitable representation of cell(s) or a cell area reference |
... |
further arguments passed to or from other methods |
Value
integer vector
Methods (by class)
-
cell_addr: Method forcell_addrobjects (ca <- cell_addr(1:4, 3)) addr_row(ca)
Specify cell limits via an anchor cell
Description
Specify the targetted cell rectangle via an upper left anchor cell and the
rectangle's row and column extent. The extent can be specified directly via
dims or indirectly via the input object. Specification via
input anticipates a write operation into the spreadsheet. If
input is one-dimensional, the byrow argument controls whether
the rectangle will extend down from the anchor or to the right. If
input is two-dimensional, the col_names argument controls
whether cells will be reserved for column or variable names. If
col_names is unspecified, default behavior is to set it to TRUE
if input has columns names and FALSE otherwise.
Usage
anchored(anchor = "A1", dim = c(1L, 1L), input = NULL, col_names = NULL,
byrow = FALSE)
Arguments
anchor |
character, specifying the upper left cell in "A1" or "R1C1" notation |
dim |
integer vector, of length two, holding the number of rows and
columns of the targetted rectangle; ignored if |
input |
a one- or two-dimensioanl input object, used to determine the extent of the targetted rectangle |
col_names |
logical, indicating whether a row should be reserved for the
column or variable names of a two-dimensional input; if omitted, will be
determined by checking whether |
byrow |
logical, indicating whether a one-dimensional input should run down or to the right |
Value
a cell_limits object
Examples
anchored()
as.range(anchored())
dim(anchored())
anchored("Q24")
as.range(anchored("Q24"))
dim(anchored("Q24"))
anchored(anchor = "R4C2", dim = c(8, 2))
as.range(anchored(anchor = "R4C2", dim = c(8, 2)))
as.range(anchored(anchor = "R4C2", dim = c(8, 2)), fo = "A1")
dim(anchored(anchor = "R4C2", dim = c(8, 2)))
(input <- head(iris))
anchored(input = input)
as.range(anchored(input = input))
dim(anchored(input = input))
anchored(input = input, col_names = FALSE)
as.range(anchored(input = input, col_names = FALSE))
dim(anchored(input = input, col_names = FALSE))
(input <- LETTERS[1:8])
anchored(input = input)
as.range(anchored(input = input))
dim(anchored(input = input))
anchored(input = input, byrow = TRUE)
as.range(anchored(input = input, byrow = TRUE))
dim(anchored(input = input, byrow = TRUE))
Convert to a cell_addr object
Description
Convert various representations of a cell reference into an object of class
cell_addr. Recall that cell_addr objects hold
absolute row and column location, so ra_ref objects or cell
reference strings with relative or mixed references will raise a warning and
generate NAs.
Usage
as.cell_addr(x, ...)
as.cell_addr_v(x, ...)
## S3 method for class 'ra_ref'
as.cell_addr(x, ...)
## S3 method for class 'list'
as.cell_addr_v(x, ...)
## S3 method for class 'character'
as.cell_addr(x, fo = NULL, strict = TRUE, ...)
## S3 method for class 'character'
as.cell_addr_v(x, fo = NULL, strict = TRUE, ...)
Arguments
x |
a cell reference |
... |
further arguments passed to or from other methods |
fo |
either |
strict |
logical, affects reading and writing of A1 formatted cell
references. When |
Value
a cell_addr object
Examples
as.cell_addr(ra_ref())
rar <- ra_ref(2, TRUE, 5, TRUE)
as.cell_addr(rar)
## mixed reference
rar <- ra_ref(2, FALSE, 5, TRUE)
as.cell_addr(rar)
ra_ref_list <-
list(ra_ref(), ra_ref(2, TRUE, 5, TRUE), ra_ref(2, FALSE, 5, TRUE))
as.cell_addr_v(ra_ref_list)
as.cell_addr("$D$12")
as.cell_addr("R4C3")
as.cell_addr(c("$C$4", "$D$12"))
as.cell_addr("$F2")
as.cell_addr("R[-4]C3")
as.cell_addr("F2", strict = FALSE)
Convert to a ra_ref object
Description
Convert various representations of a cell reference into an object of class
ra_ref.
-
as.ra_refis NOT vectorized and therefore requires the input to represent exactly one cell, i.e. be of length 1. -
as.ra_ref_vaccepts input of length >= 1 and returns a list ofra_refobjects.
Usage
as.ra_ref(x, ...)
as.ra_ref_v(x, ...)
## S3 method for class 'character'
as.ra_ref(x, fo = NULL, strict = TRUE, ...)
## S3 method for class 'character'
as.ra_ref_v(x, fo = NULL, strict = TRUE, ...)
## S3 method for class 'cell_addr'
as.ra_ref(x, ...)
## S3 method for class 'cell_addr'
as.ra_ref_v(x, ...)
Arguments
x |
one or more cell references, as a character vector or
|
... |
further arguments passed to or from other methods |
fo |
either |
strict |
logical, affects reading and writing of A1 formatted cell
references. When |
Value
a ra_ref object, in the case of as.ra_ref, or a
list of them, in the case of as.ra_ref_v
Examples
## as.ra_ref.character()
as.ra_ref("$F$2")
as.ra_ref("R[-4]C3")
as.ra_ref("B4")
as.ra_ref("B4", strict = FALSE)
as.ra_ref("B$4")
## this is actually ambiguous! is format A1 or R1C1 format?
as.ra_ref("RC2")
## format could be specified in this case
as.ra_ref("RC2", fo = "R1C1")
as.ra_ref("RC2", fo = "A1", strict = FALSE)
## as.ra_ref_v.character()
cs <- c("$A$1", "Sheet1!$F$14", "Sheet2!B$4", "D9")
## Not run:
## won't work because as.ra_ref requires length one input
as.ra_ref(cs)
## End(Not run)
## use as.ra_ref_v instead
as.ra_ref_v(cs, strict = FALSE)
## as.ra_ref.cell_addr
ca <- cell_addr(2, 5)
as.ra_ref(ca)
## as.ra_ref_v.cell_addr()
ca <- cell_addr(1:3, 1)
## Not run:
## won't work because as.ra_ref methods not natively vectorized
as.ra_ref(ca)
## End(Not run)
## use as.ra_ref_v instead
as.ra_ref_v(ca)
Convert a cell_limits object to a cell range
Description
Convert a cell_limits object to a cell range
Usage
as.range(x, fo = c("R1C1", "A1"), strict = FALSE, sheet = NULL)
Arguments
x |
a cell_limits object |
fo |
either |
strict |
logical, affects reading and writing of A1 formatted cell
references. When |
sheet |
logical, indicating whether to include worksheet name; if
|
Value
length one character vector holding a cell range
Examples
rgCL <- cell_limits(ul = c(1, 2), lr = c(7, 6))
as.range(rgCL)
as.range(rgCL, fo = "A1")
rgCL_ws <- cell_limits(ul = c(1, 2), lr = c(7, 6), sheet = "A Sheet")
as.range(rgCL_ws)
as.range(rgCL_ws, fo = "A1")
cell_addr class
Description
The cell_addr class is used to hold the absolute row and column
location for one or more cells. An object of class cell_addr is a list
with two components of equal length, named row and col,
consisting of integers greater than or equal to one or NA. This is in
contrast to the ra_ref class, which holds a representation of a
single absolute, relative, or mixed cell reference from, e.g., a formula.
Usage
cell_addr(row, col)
Arguments
row |
integer. Must be the same length as |
col |
integer. Same deal as for |
Value
a cell_addr object
Reference
Spreadsheet Implementation Technology: Basics and Extensions Peter Sestoft MIT Press 2014
Examples
cell_addr(4, 3)
(ca <- cell_addr(1:4, 3))
ca[2:3]
ca[[4]]
length(ca)
Specify cell limits only for columns
Description
How does this differ from cell_limits? Two ways. First, the
input can have length greater than 2, i.e. the columns can be specified as
1:n. If the length is greater than 2, both the min and max are taken
with NA.rm = TRUE. Note it is not possible to request non-contiguous
columns, i.e. columns 1, 2, and 5. In this case, the requested columns will
run from the minimum of 1 to the maximum of 5. Second, the input can be given
in the letter-based format spreadsheets use to label columns.
Usage
cell_cols(x)
Arguments
x |
vector of column limits; if character, converted to numeric; if
length greater than two, min and max will be taken with |
Value
a cell_limits object
Examples
cell_cols(c(NA, 3))
cell_cols(c(7, NA))
cell_cols(4:16)
cell_cols(c(3, NA, 10))
cell_cols("C:G")
cell_cols(c("B", NA))
cell_cols(LETTERS)
Create a cell_limits object
Description
A cell_limits object is a list with three components:
Usage
cell_limits(ul = c(NA_integer_, NA_integer_), lr = c(NA_integer_,
NA_integer_), sheet = NA_character_)
## S3 method for class 'cell_limits'
dim(x)
as.cell_limits(x, ...)
## S3 method for class 'cell_limits'
as.cell_limits(x, ...)
## S3 method for class 'NULL'
as.cell_limits(x, ...)
## S3 method for class 'character'
as.cell_limits(x, fo = NULL, ...)
Arguments
ul |
vector identifying upper left cell of target rectangle |
lr |
vector identifying lower right cell of target rectangle |
sheet |
string containing worksheet name, optional |
x |
input to convert into a |
... |
further arguments passed to or from other methods |
fo |
either |
Details
-
ulvector specifying upper left cell of target rectangle, of the formc(ROW_MIN, COL_MIN) -
lrvector specifying lower right cell of target rectangle, of the formc(ROW_MAX, COL_MAX) -
sheetstring specifying worksheet name, which may beNA, meaning it's unspecified
A value of NA in ul or lr means the corresponding limit
is left unspecified. Therefore a verbose way to specify no limits at all
would be cell_limits(c(NA, NA), c(NA, NA)). If the maximum row or
column is specified but the associated minimum is not, then the minimum is
set to 1.
When specified via character, cell references can be given in A1 or R1C1
notation and must be interpretable as absolute references. For A1, this means
either both row and column are annotated with a dollar sign $ or
neither is. So, no mixed references, like B$4. For R1C1, this means no
square brackets, like R[-3]C[3].
Value
a cell_limits object
Examples
cell_limits(c(1, 3), c(1, 5))
cell_limits(c(NA, 7), c(3, NA))
cell_limits(c(NA, 7))
cell_limits(lr = c(3, 7))
cell_limits(c(1, 3), c(1, 5), "Sheet1")
cell_limits(c(1, 3), c(1, 5), "Spaces are evil")
dim(as.cell_limits("A1:F10"))
as.cell_limits("A1")
as.cell_limits("$Q$24")
as.cell_limits("A1:D8")
as.cell_limits("R5C11")
as.cell_limits("R2C3:R6C9")
as.cell_limits("Sheet1!R2C3:R6C9")
as.cell_limits("'Spaces are evil'!R2C3:R6C9")
## Not run:
## explicitly mixed A1 references won't work
as.cell_limits("A$2")
## mixed or relative R1C1 references won't work
as.cell_limits("RC[4]")
## End(Not run)
Specify cell limits only for rows
Description
How does this differ from cell_limits? Here the input can have
length greater than 2, i.e. the rows can be specified as 1:n. If the
length is greater than 2, both the min and max are taken with NA.rm =
TRUE. Note it is not possible to request non-contiguous rows, i.e. rows 1,
2, and 5. In this case, the requested rows will run from the minimum of 1 to
the maximum of 5.
Usage
cell_rows(x)
Arguments
x |
numeric vector of row limits; if length greater than two, min and
max will be taken with |
Value
a cell_limits object
Examples
cell_rows(c(NA, 3))
cell_rows(c(7, NA))
cell_rows(4:16)
cell_rows(c(3, NA, 10))
dim(cell_rows(1:5))
Guess cell reference string format
Description
Guess if cell references are in R1C1 or A1 format.
Usage
guess_fo(x, fo = c("R1C1", "A1"))
Arguments
x |
character vector of cell reference strings |
fo |
default to assume if format is ambiguous |
Value
character vector consisting of R1C1, A1, or NA
Examples
A1 <- c("A1", "$A1", "A$1", "$A$1", "a1")
guess_fo(A1)
R1C1 <- c("R1C1", "R1C[-1]", "R[-1]C1", "R[-1]C[9]")
guess_fo(R1C1)
guess_fo("RC2")
guess_fo("12")
guess_fo(12)
Test cell reference strings
Description
Test cell reference strings for a specific format.
Usage
is_A1(x)
is_R1C1(x)
Arguments
x |
character vector of cell reference strings |
Value
a logical vector
Functions
-
is_A1: A1 format, case insenstive; relative, absolute, or mixed -
is_R1C1: R1C1 format; relative, absolute, or mixed
Examples
is_A1("A1")
is_R1C1("A1")
is_R1C1("R4C12")
x <- c("A1", "$A4", "$b$12", "RC1", "R[-4]C9", "R5C3")
data.frame(x, is_A1(x), is_R1C1(x))
Convert between letter and integer representations of column IDs
Description
Convert "A1"-style column IDs from a letter representation to an integer, e.g. column A becomes 1, column D becomes 4, etc. Or go the other way around.
Usage
letter_to_num(x)
num_to_letter(y)
Arguments
x |
a character vector of "A1" style column IDs (case insensitive) |
y |
a vector of integer column IDs |
Details
Google Sheets have up to 300 columns (column KN).
Excel 2010 spreadsheets have up to 16,384 columns (column XFD).
ZZ is column 702.
ZZZ is column 18,278 (no known spreadsheet actually goes that high).
Value
a vector of column IDs, either character or integer
Examples
letter_to_num('Z')
letter_to_num(c('AA', 'ZZ', 'ABD', 'ZZZ'))
letter_to_num(c(NA, ''))
num_to_letter(28)
num_to_letter(900)
num_to_letter(18278)
num_to_letter(c(25, 52, 900, 18278))
num_to_letter(c(NA, 0, 4.8, -4))
Print ra_ref object
Description
Print ra_ref object
Usage
## S3 method for class 'ra_ref'
print(x, fo = c("R1C1", "A1"), ...)
Arguments
x |
an object of class |
fo |
either |
... |
further arguments passed to or from other methods |
Examples
(rar <- ra_ref(3, TRUE, 1, TRUE))
print(ra_ref(), fo = "A1")
ra_ref class
Description
The ra_ref class is used to represent a single relative, absolute, or
mixed cell reference, presumably found in a formula. When row_abs is
TRUE, it means that row_ref identifies a specific row in an
absolute sense. When row_abs is FALSE, it means that
row_ref holds a positive, zero, or negative offset relative to the
address of the cell containing the formula that contains the associated cell
reference. Ditto for col_abs and col_ref.
Usage
ra_ref(row_ref = 1L, row_abs = TRUE, col_ref = 1L, col_abs = TRUE,
sheet = NA_character_, file = NA_character_)
Arguments
row_ref |
integer, row or row offset |
row_abs |
logical indicating whether |
col_ref |
integer, column or column offset |
col_abs |
logical indicating whether |
sheet |
the name of a sheet (a.k.a. worksheet or tab) |
file |
the name of a file (a.k.a. workbook) |
Details
A ra_ref object can also store the name of a sheet and a file, though
these will often be NA. A cell reference in a formula can potentially
be qualified like this: [my_workbook.xlxs]Sheet1!R2C3. In Testoft
(2014), he creates an entirely separate class for this, a cell_ref,
which consists of a sheet- and file-ignorant ra_ref object and a sheet
reference (he doesn't allow formulas to refer to other files). I hope I
don't regret choosing a different path.
Value
a ra_ref object
Reference
Spreadsheet Implementation Technology: Basics and Extensions Peter Sestoft MIT Press 2014
Examples
ra_ref()
ra_ref(row_ref = 3, col_ref = 2)
ra_ref(row_ref = 10, row_abs = FALSE, col_ref = 3, col_abs = TRUE)
ra_ref(sheet = "a sheet")
Get string representation of cell references
Description
Convert various representations of a cell reference to character
-
to_stringis not necessarily vectorized. For example, when the the input is of classra_ref, it must of be of length one. However, to be honest, this will actually work forcell_addr, even when length > 1. -
to_string_vis guaranteed to be vectorized. In particular, input can be acell_addrof length >= 1 or a list ofra_refobjects.
If either the row or column reference is relative, note that, in general, it's impossible to convert to an "A1" formatted string. We would have to know "relative to what?".
Usage
to_string(x, fo = c("R1C1", "A1"), strict = TRUE, sheet = NULL, ...)
to_string_v(x, fo = c("R1C1", "A1"), strict = TRUE, sheet = NULL, ...)
## S3 method for class 'ra_ref'
to_string(x, fo = c("R1C1", "A1"), strict = TRUE,
sheet = NULL, ...)
## S3 method for class 'list'
to_string_v(x, fo = c("R1C1", "A1"), strict = TRUE,
sheet = NULL, ...)
## S3 method for class 'cell_addr'
to_string(x, fo = c("R1C1", "A1"), strict = TRUE,
sheet = FALSE, ...)
## S3 method for class 'cell_addr'
to_string_v(x, fo = c("R1C1", "A1"), strict = TRUE,
sheet = FALSE, ...)
Arguments
x |
a suitable representation of a cell or cell area reference: a single
|
fo |
either |
strict |
logical, affects reading and writing of A1 formatted cell
references. When |
sheet |
logical, indicating whether to include worksheet name; if
|
... |
further arguments passed to or from other methods |
Value
a character vector
Examples
## exactly one ra_ref --> string
to_string(ra_ref())
to_string(ra_ref(), fo = "A1")
to_string(ra_ref(), fo = "A1", strict = FALSE)
to_string(ra_ref(row_ref = 3, col_ref = 2))
to_string(ra_ref(row_ref = 3, col_ref = 2, sheet = "helloooo"))
(mixed_ref <- ra_ref(row_ref = 10, row_abs = FALSE, col_ref = 3))
to_string(mixed_ref)
## this will raise warning and generate NA, because row reference is
## relative and format is A1
to_string(mixed_ref, fo = "A1")
## a list of ra_ref's --> character vector
ra_ref_list <-
list(ra_ref(), ra_ref(2, TRUE, 5, TRUE), ra_ref(2, FALSE, 5, TRUE))
to_string_v(ra_ref_list)
## cell_addr --> string
(ca <- cell_addr(3, 8))
to_string(ca)
to_string(ca, fo = "A1")
(ca <- cell_addr(1:4, 3))
to_string(ca)
to_string(ca, fo = "A1")
## explicitly go from cell_addr, length > 1 --> character vector
(ca <- cell_addr(1:4, 3))
to_string_v(ca)
to_string_v(ca, fo = "A1")