Create a sequence between two letters
Another option with match
, seq
and do.call
:
letters[do.call(seq, as.list(match(c("b","f"), letters)))]
which gives:
[1] "b" "c" "d" "e" "f"
Making a function of this such that it works with both lower-case and upper-case letters:
char_seq <- function(lets) {
switch(all(grepl("[[:upper:]]", lets)) + 1L,
letters[do.call(seq, as.list(match(lets, letters)))],
LETTERS[do.call(seq, as.list(match(lets, LETTERS)))])
}
the output of this:
> char_seq(c("b","f")) [1] "b" "c" "d" "e" "f" > char_seq(c("B","F")) [1] "B" "C" "D" "E" "F"
This function can be extended with checks on the correctness of the input:
char_seq <- function(lets) {
g <- grepl("[[:upper:]]", lets)
if(length(g) != 2) stop("Input is not of length 2")
if(sum(g) == 1) stop("Input does not have all lower-case or all upper-case letters")
switch(all(g) + 1L,
letters[do.call(seq, as.list(match(lets, letters)))],
LETTERS[do.call(seq, as.list(match(lets, LETTERS)))])
}
resulting in proper error-messages when the input is not correct:
> char_seq(c("B")) Error in char_seq(c("B")) : Input is not of length 2 > char_seq(c("b","F")) Error in char_seq(c("b", "F")) : Input does not have all lower-case or all upper-case letters
You can create your own function:
`%:%` <- function(l, r) {
intToUtf8(seq(utf8ToInt(l), utf8ToInt(r)), multiple = TRUE)
}
Usage:
"b" %:% "f"
# [1] "b" "c" "d" "e" "f"
"f" %:% "b"
# [1] "f" "e" "d" "c" "b"
"A" %:% "D"
# [1] "A" "B" "C" "D"
This would be another base R option:
letters[(letters >= "b") & (letters <= "f")]
# [1] "b" "c" "d" "e" "f"