diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..91114bf --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,2 @@ +^.*\.Rproj$ +^\.Rproj\.user$ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..09a72cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.Rproj.user +.Rhistory +.RData +inst/doc diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..6a1cc84 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,16 @@ +Package: phonenumber +Title: Convert letters to numbers and back as on a telephone keypad +Version: 0.1.0 +Authors@R: person("Steve", "Myles", email = "steve@mylesandmyles.info", role = c("aut", "cre")) +Description: This package convert English letters to numbers or numbers to + English letters as on a telephone keypad. When converting letters to + numbers, a character vector is returned with "A," "B," or "C" becoming 2, + "D," "E", or "F" becoming 3, etc. When converting numbers to letters, a + character vector is returned with multiple elements (i.e., "2" becomes a + vector of "A," "B," and "C"). +Depends: R (>= 3.1.3) +License: MIT +LazyData: true +VignetteBuilder: knitr +Suggests: knitr, + testthat diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..e58bfd9 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,4 @@ +# Generated by roxygen2 (4.1.1): do not edit by hand + +export(letterToNumber) +export(numberToLetter) diff --git a/R/letterToNumber.R b/R/letterToNumber.R new file mode 100644 index 0000000..1eae5b2 --- /dev/null +++ b/R/letterToNumber.R @@ -0,0 +1,40 @@ +#' +#' Convert letters to numbers as on a telephone's keypad +#' +#' Take a character vector and convert it to the equivalent number sequence +#' from a telephone's key pad +#' +#' @param value An input value as a character vector with one element (a string) +#' +#' @export +#' +#' @examples +#' letterToNumber("R functions") +#' string <- "Phone Number" +#' letterToNumber(string) +#' letterToNumber("Jenny's Number is 867-5309") +#' @return A character vector of numbers and dashes based on value + +letterToNumber <- function(value) { + if(is.na(value)) { stop("Argument must be a string.") } else { + value <- as.character(value) + value <- gsub("[^A-Za-z0-9]", "-", value) + value <- toupper(value) + valueSplit <- strsplit(value, "")[[1]] + numString <- as.character() + for (char in valueSplit) { + elem <- ifelse(is.element(char, LETTERS[1:3]), "2", + ifelse(is.element(char, LETTERS[4:6]), "3", + ifelse(is.element(char, LETTERS[7:9]), "4", + ifelse(is.element(char, LETTERS[10:12]), "5", + ifelse(is.element(char, LETTERS[13:15]), "6", + ifelse(is.element(char, LETTERS[16:19]), "7", + ifelse(is.element(char, LETTERS[20:22]), "8", + ifelse(is.element(char, "-") | + suppressWarnings(!is.na(as.numeric(char))), char, + "9")))))))) + numString <- c(numString, elem) + } + return(paste0(numString, collapse = "")) + } +} \ No newline at end of file diff --git a/R/numberToLetter.R b/R/numberToLetter.R new file mode 100644 index 0000000..8afcf5c --- /dev/null +++ b/R/numberToLetter.R @@ -0,0 +1,43 @@ +#' +#' Convert numbers to letters as on a telephone's keypad +#' +#' Take a character vector (i.e., a telephone number) and convert it to all +#' all possible letter combinations as on from a telephone's key pad +#' +#' @param value An input value as a character vector with one element (a string) +#' +#' @export +#' +#' @examples +#' numberToLetter("911") +#' numberToLetter(911) +#' numberToLetter("911!") +#' numberToLetter() +#' +#' @return A character vector of letters and dashes based on value + +numberToLetter <- function(value, decreasing = FALSE) { + if(is.na(value)) { stop("Argument must be a string.") } else { + value <- as.character(value) + value <- gsub("[^A-Za-z0-9]", "-", value) + value <- toupper(value) + valueSplit <- strsplit(value, "")[[1]] + strList <- list() + for (char in valueSplit) { + letterSplit <- if (char == "2") { strsplit(LETTERS[1:3], "") } else { + if (char == "3") { strsplit(LETTERS[4:6], "") } else { + if (char == "4") { strsplit(LETTERS[7:9], "") } else { + if (char == "5") { strsplit(LETTERS[10:12], "") } else { + if (char == "6") { strsplit(LETTERS[13:15], "") } else { + if (char == "7") { strsplit(LETTERS[16:19], "") } else { + if (char == "8") { strsplit(LETTERS[20:22], "") } else { + if (char == "9") { strsplit(LETTERS[23:26], "") } else { char } + }}}}}}} + strList[[length(strList)+1]] <- letterSplit + } + strDF <- expand.grid(strList) + lettString <- do.call(paste0, strDF[1:ncol(strDF)]) + lettString <- sort(lettString, decreasing) + return(lettString) + } +} \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..8b8b5b8 --- /dev/null +++ b/README @@ -0,0 +1,8 @@ +phonenumber +=========== + +An R package that converts English letters to numbers or numbers to English +letters as on a telephone keypad. When converting letters to numbers, a +character vector is returned with "A," "B," or "C" becoming 2, "D," "E", or "F" becoming 3, etc. When converting numbers to letters, a character vector is +returned with multiple elements (i.e., "2" becomes a vector of "A," "B," and \ +"C"). \ No newline at end of file diff --git a/man/letterToNumber.Rd b/man/letterToNumber.Rd new file mode 100644 index 0000000..06a6583 --- /dev/null +++ b/man/letterToNumber.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2 (4.1.1): do not edit by hand +% Please edit documentation in R/letterToNumber.R +\name{letterToNumber} +\alias{letterToNumber} +\title{Convert letters to numbers as on a telephone's keypad} +\usage{ +letterToNumber(value) +} +\arguments{ +\item{value}{An input value as a character vector with one element (a string)} +} +\value{ +A character vector of numbers and dashes based on value +} +\description{ +Take a character vector and convert it to the equivalent number sequence +from a telephone's key pad +} +\examples{ +letterToNumber("R functions") +string <- "Phone Number" +letterToNumber(string) +letterToNumber("Jenny's Number is 867-5309") +} + diff --git a/man/numberToLetter.Rd b/man/numberToLetter.Rd new file mode 100644 index 0000000..2356fef --- /dev/null +++ b/man/numberToLetter.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2 (4.1.1): do not edit by hand +% Please edit documentation in R/numberToLetter.R +\name{numberToLetter} +\alias{numberToLetter} +\title{Convert numbers to letters as on a telephone's keypad} +\usage{ +numberToLetter(value, decreasing = FALSE) +} +\arguments{ +\item{value}{An input value as a character vector with one element (a string)} +} +\value{ +A character vector of letters and dashes based on value +} +\description{ +Take a character vector (i.e., a telephone number) and convert it to all +all possible letter combinations as on from a telephone's key pad +} +\examples{ +numberToLetter("911") +numberToLetter(911) +numberToLetter("911!") +numberToLetter() +} + diff --git a/phonenumber.Rproj b/phonenumber.Rproj new file mode 100644 index 0000000..d848a9f --- /dev/null +++ b/phonenumber.Rproj @@ -0,0 +1,16 @@ +Version: 1.0 + +RestoreWorkspace: No +SaveWorkspace: No +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +Encoding: UTF-8 + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace diff --git a/tests/testthat.R b/tests/testthat.R new file mode 100644 index 0000000..f14f481 --- /dev/null +++ b/tests/testthat.R @@ -0,0 +1,4 @@ +library(testthat) +library(phonenumber) + +test_check("phonenumber") diff --git a/tests/testthat/phonenumber/NAMESPACE b/tests/testthat/phonenumber/NAMESPACE new file mode 100644 index 0000000..9c9f9ac --- /dev/null +++ b/tests/testthat/phonenumber/NAMESPACE @@ -0,0 +1 @@ +exportPattern("^[^\\.]") diff --git a/tests/testthat/test-letterToNumber.R b/tests/testthat/test-letterToNumber.R new file mode 100644 index 0000000..8579d11 --- /dev/null +++ b/tests/testthat/test-letterToNumber.R @@ -0,0 +1,64 @@ +library(phonenumber) +context("letterToNumber") + +test_that("letterToNumber returns the correct numbers", { + expect_equal(letterToNumber("a"), "2") + expect_equal(letterToNumber("b"), "2") + expect_equal(letterToNumber("c"), "2") + expect_equal(letterToNumber("d"), "3") + expect_equal(letterToNumber("e"), "3") + expect_equal(letterToNumber("f"), "3") + expect_equal(letterToNumber("g"), "4") + expect_equal(letterToNumber("h"), "4") + expect_equal(letterToNumber("i"), "4") + expect_equal(letterToNumber("j"), "5") + expect_equal(letterToNumber("k"), "5") + expect_equal(letterToNumber("l"), "5") + expect_equal(letterToNumber("m"), "6") + expect_equal(letterToNumber("n"), "6") + expect_equal(letterToNumber("o"), "6") + expect_equal(letterToNumber("p"), "7") + expect_equal(letterToNumber("q"), "7") + expect_equal(letterToNumber("r"), "7") + expect_equal(letterToNumber("s"), "7") + expect_equal(letterToNumber("t"), "8") + expect_equal(letterToNumber("u"), "8") + expect_equal(letterToNumber("v"), "8") + expect_equal(letterToNumber("w"), "9") + expect_equal(letterToNumber("x"), "9") + expect_equal(letterToNumber("y"), "9") + expect_equal(letterToNumber("z"), "9") + expect_equal(letterToNumber("A"), "2") + expect_equal(letterToNumber("B"), "2") + expect_equal(letterToNumber("C"), "2") + expect_equal(letterToNumber("D"), "3") + expect_equal(letterToNumber("E"), "3") + expect_equal(letterToNumber("F"), "3") + expect_equal(letterToNumber("G"), "4") + expect_equal(letterToNumber("H"), "4") + expect_equal(letterToNumber("I"), "4") + expect_equal(letterToNumber("J"), "5") + expect_equal(letterToNumber("K"), "5") + expect_equal(letterToNumber("L"), "5") + expect_equal(letterToNumber("M"), "6") + expect_equal(letterToNumber("N"), "6") + expect_equal(letterToNumber("O"), "6") + expect_equal(letterToNumber("P"), "7") + expect_equal(letterToNumber("Q"), "7") + expect_equal(letterToNumber("R"), "7") + expect_equal(letterToNumber("S"), "7") + expect_equal(letterToNumber("T"), "8") + expect_equal(letterToNumber("U"), "8") + expect_equal(letterToNumber("V"), "8") + expect_equal(letterToNumber("W"), "9") + expect_equal(letterToNumber("X"), "9") + expect_equal(letterToNumber("Y"), "9") + expect_equal(letterToNumber("Z"), "9") + expect_equal(letterToNumber("1"), "1") + expect_equal(letterToNumber("0"), "0") + expect_equal(letterToNumber("-"), "-") + expect_equal(letterToNumber("#"), "-") + expect_equal(letterToNumber("!"), "-") + expect_equal(letterToNumber(" "), "-") + expect_equal(letterToNumber("adZ 123"), "239-123") +}) \ No newline at end of file diff --git a/tests/testthat/test-numberToLetter.R b/tests/testthat/test-numberToLetter.R new file mode 100644 index 0000000..8b45fc3 --- /dev/null +++ b/tests/testthat/test-numberToLetter.R @@ -0,0 +1,20 @@ +library(phonenumber) +context("numberToLetter") + +test_that("numberToLetter returns the correct letters", { + expect_equal(numberToLetter("2"), c("A", "B", "C")) + expect_equal(numberToLetter("3"), c("D", "E", "F")) + expect_equal(numberToLetter("4"), c("G", "H", "I")) + expect_equal(numberToLetter("5"), c("J", "K", "L")) + expect_equal(numberToLetter("6"), c("M", "N", "O")) + expect_equal(numberToLetter("7"), c("P", "Q", "R", "S")) + expect_equal(numberToLetter("8"), c("T", "U", "V")) + expect_equal(numberToLetter("9"), c("W", "X", "Y", "Z")) + expect_equal(numberToLetter("1"), "1") + expect_equal(numberToLetter("0"), "0") + expect_equal(numberToLetter("-"), "-") + expect_equal(numberToLetter("#"), "-") + expect_equal(numberToLetter("!"), "-") + expect_equal(numberToLetter(" "), "-") + expect_equal(numberToLetter("911!"), c("W11-", "X11-", "Y11-", "Z11-")) +}) \ No newline at end of file diff --git a/vignettes/phonenumber.Rmd b/vignettes/phonenumber.Rmd new file mode 100644 index 0000000..307850b --- /dev/null +++ b/vignettes/phonenumber.Rmd @@ -0,0 +1,79 @@ +--- +title: "Phone Number" +author: "Steve Myles" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{Vignette Title} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +## Introduction to phonenumber + +This document describes the usage of the two functions in the `phonenumber` +package. Note that, though this package's functions convert back and forth from +numbers to English letters as on a telephone's keypad. Note that the length of +the character string need not conform to any standard length telephone number. + +### phonenumber's functions + +* `letterToNumber` +* `numberToLetter` + +### Telephone keypad + +For purposes of this package, the mapping of numbers to letters on a telephone's +keypad are as follows: + +* 2 corresponds to A, B, C +* 3 corresponds to D, E, F +* 4 corresponds to G, H, I +* 5 corresponds to J, K, L +* 6 corresponds to M, N, O +* 7 corresponds to P, Q, R, S +* 8 corresponds to T, U, V +* 9 corresponds to W, X, Y, Z +* 1 and 0 do not have corresponding letters + +(I am aware that on some telephones, primarily older models, Q and Z are mapped +to 0 rather than to 7 and 9.) + +## `letterToNumber` + +`letterToNumber` converts a string containing letters into the corresponding +numbers on a telephone's keypad. For example, if the user wants to know what telephone number corresponds to "Texas:" + +```{r letterToNumber ex1, echo = TRUE} +string <- "Texas" +letterToNumber(string) +``` + +The function is not limited to letters, though. Any numeric characters are +returned as is and any non-alphanumeric characters (including spaces) are +converted to dashes (-) and 1 and 0 are returned as is: + +```{r letterToNumber ex2, echo = TRUE} +string <- "Texas is #1" +letterToNumber(string) +``` + +## `numberToLetter` + +`numberToLetter` converts a string containing numbers into the corresponding +letters on a telephone's keypad. For example, if the user wants to know what +possible character strings could be spelled by a sequence of numbers (e.g., 22): + +```{r numberToLetter ex1, echo = TRUE} +string <- "22" +numberToLetter(string) +``` + +The function is not limited to numbers, though. Any alphabetic characters are +returned as is and any non-alphanumeric characters (including spaces) are +converted to dashes (-) and 1 and 0 are returned as is: + +```{r numberToLetter ex2, echo = TRUE} +string <- "806!" +numberToLetter(string) +``` \ No newline at end of file diff --git a/vignettes/phonenumber.html b/vignettes/phonenumber.html new file mode 100644 index 0000000..855bd74 --- /dev/null +++ b/vignettes/phonenumber.html @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + +Phone Number + + + + + + + + + + + + + + + +
+

Introduction to phonenumber

+

This document describes the usage of the two functions in the phonenumber package.

+
+
+

letterToNumber

+
+ + + + + + + +