Skip to content

Commit

Permalink
adding files
Browse files Browse the repository at this point in the history
  • Loading branch information
Scumdogsteev committed Jul 5, 2015
1 parent eb2f2ad commit 5173c78
Show file tree
Hide file tree
Showing 16 changed files with 407 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .Rbuildignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
^.*\.Rproj$
^\.Rproj\.user$
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.Rproj.user
.Rhistory
.RData
inst/doc
16 changes: 16 additions & 0 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -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 = "[email protected]", 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
4 changes: 4 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Generated by roxygen2 (4.1.1): do not edit by hand

export(letterToNumber)
export(numberToLetter)
40 changes: 40 additions & 0 deletions R/letterToNumber.R
Original file line number Diff line number Diff line change
@@ -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 = ""))
}
}
43 changes: 43 additions & 0 deletions R/numberToLetter.R
Original file line number Diff line number Diff line change
@@ -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)
}
}
8 changes: 8 additions & 0 deletions README
Original file line number Diff line number Diff line change
@@ -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").
25 changes: 25 additions & 0 deletions man/letterToNumber.Rd
Original file line number Diff line number Diff line change
@@ -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")
}

25 changes: 25 additions & 0 deletions man/numberToLetter.Rd
Original file line number Diff line number Diff line change
@@ -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()
}

16 changes: 16 additions & 0 deletions phonenumber.Rproj
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions tests/testthat.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
library(testthat)
library(phonenumber)

test_check("phonenumber")
1 change: 1 addition & 0 deletions tests/testthat/phonenumber/NAMESPACE
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
exportPattern("^[^\\.]")
64 changes: 64 additions & 0 deletions tests/testthat/test-letterToNumber.R
Original file line number Diff line number Diff line change
@@ -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")
})
20 changes: 20 additions & 0 deletions tests/testthat/test-numberToLetter.R
Original file line number Diff line number Diff line change
@@ -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-"))
})
79 changes: 79 additions & 0 deletions vignettes/phonenumber.Rmd
Original file line number Diff line number Diff line change
@@ -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)
```
Loading

0 comments on commit 5173c78

Please sign in to comment.