Rev 76253 | Rev 87588 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% File src/library/utils/man/roman.Rd% Part of the R package, https://www.R-project.org% Copyright 1995-2019 R Core Team% Distributed under GPL 2 or later\name{roman}\title{Roman Numerals}\alias{as.roman}\alias{.romans}\alias{Ops.roman}\alias{Summary.roman}\description{Simple manipulation of (a small set of) integer numbers as roman numerals.}\usage{as.roman(x).romans\special{% no \aliasr1 + r2r1 <= r2max(r1)sum(r2)}}\arguments{\item{x}{a numeric or character vector of arabic or roman numerals.}\item{r1, r2}{a roman number vector, i.e., of \code{\link{class}}\code{"roman"}.}}\details{\code{as.roman} creates objects of class \code{"roman"} which areinternally represented as integers, and have suitable methods forprinting, formatting, subsetting, coercion, etc, see\code{\link{methods}(class = "roman")}.Arithmetic (\code{"\link{Arith}"}), Comparison (\code{"\link{Compare}"})and (\code{"\link{Logic}"}), i.e., all \code{"\link{Ops}"} groupoperations work as for regular numbers via \R's integer functionality.Only numbers between 1 and 3899 have a unique representation as romannumbers, and hence others result in \code{as.roman(NA)}.\code{.romans} is the basic dictionary, a named \code{\link{character}} vector.}\references{Wikipedia contributors (2006). Roman numerals.Wikipedia, The Free Encyclopedia.\url{https://en.wikipedia.org/w/index.php?title=Roman_numerals&oldid=78252134}.Accessed September 29, 2006.}\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)\dontshow{stopifnot(identical(as.character(as.roman("2016") - 10*c(0:3,10)),c("MMXVI", "MMVI", "MCMXCVI", "MCMLXXXVI", "MCMXVI"))) }## 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,..,3899} :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"})}\keyword{arith}