roman {utils} | R Documentation |
Roman Numerals
Description
Simple manipulation of (a small set of) integer numbers as roman numerals.
Usage
as.roman(x)
.romans
r1 + r2
r1 <= r2
max(r1)
sum(r2)
Arguments
x |
a numeric or character vector of arabic or roman numerals. |
r1 , r2 |
a roman number vector, i.e., of |
Details
as.roman
creates objects of class "roman"
which are
internally represented as integers, and have suitable methods for
printing, formatting, subsetting, coercion, etc, see
methods(class = "roman")
.
Arithmetic ("Arith"
), Comparison ("Compare"
)
and ("Logic"
), i.e., all "Ops"
group
operations work as for regular numbers via R's integer functionality.
Only numbers between 1 and 3999 have a unique representation as roman
numbers, and hence others result in as.roman(NA)
.
.romans
is the basic dictionary, a named character
vector.
References
Wikipedia contributors (2024). Roman numerals. Wikipedia, The Free Encyclopedia. https://en.wikipedia.org/w/index.php?title=Roman_numerals&oldid=1188781837. Accessed February 22, 2024.
Examples
## First five roman 'numbers'.
(y <- as.roman(1 : 5))
## Middle one.
y[3]
## Current year as a roman number.
(y <- as.roman(format(Sys.Date(), "%Y")))
## Today, and 10, 20, 30, and 100 years ago ...
y - 10*c(0:3,10)
## mixture of arabic and roman numbers :
as.roman(c(NA, 1:3, "", strrep("I", 1:6))) # + NA with a warning for "IIIIII"
cc <- c(NA, 1:3, strrep("I", 0:5))
(rc <- as.roman(cc)) # two NAs: 0 is not "roman"
(ic <- as.integer(rc)) # works automatically [without an explicit method]
rNA <- as.roman(NA)
## simple consistency checks -- arithmetic when result is in {1,2,..,3999} :
stopifnot(identical(rc, as.roman(rc)), # as.roman(.) is "idempotent"
identical(rc + rc + (3*rc), rc*5),
identical(ic, c(NA, 1:3, NA, 1:5)),
identical(as.integer(5*rc), 5L*ic),
identical(as.numeric(rc), as.numeric(ic)),
identical(rc[1], rNA),
identical(as.roman(0), rNA),
identical(as.roman(NA_character_), rNA),
identical(as.list(rc), as.list(ic)))
## Non-Arithmetic 'Ops' :
stopifnot(exprs = {
# Comparisons :
identical(ic < 1:5, rc < 1:5)
identical(ic < 1:5, rc < as.roman(1:5))
# Logic [integers |-> logical] :
identical(rc & TRUE , ic & TRUE)
identical(rc & FALSE, ic & FALSE)
identical(rc | FALSE, ic | FALSE)
identical(rc | NA , ic | NA)
})
## 'Summary' group functions (and comparison):
(rc. <- rc[!is.na(rc)])
stopifnot(exprs = {
identical(min(rc), as.roman(NA))
identical(min(rc, na.rm=TRUE),
as.roman(min(ic, na.rm=TRUE)))
identical(range(rc.),
as.roman(range(as.integer(rc.))))
identical(sum (rc, na.rm=TRUE), as.roman("XXI"))
identical(format(prod(rc, na.rm=TRUE)), "DCCXX")
format(prod(rc.)) == "DCCXX"
})