[med-svn] [r-cran-munsell] 01/11: New upstream version 0.4.3

Benjamin Eikel benjamin-guest at moszumanska.debian.org
Sun Oct 16 12:29:48 UTC 2016


This is an automated email from the git hooks/post-receive script.

benjamin-guest pushed a commit to branch master
in repository r-cran-munsell.

commit 251d499a0909e8770b31e49ee92e3129104a9343
Author: Benjamin Eikel <benjamin at eikel.org>
Date:   Sun Oct 16 13:40:50 2016 +0200

    New upstream version 0.4.3
---
 DESCRIPTION                   |  22 ++--
 LICENSE                       |   2 +-
 MD5                           |  75 ++++++-----
 NAMESPACE                     |   7 +
 NEWS => NEWS.md               |  16 +++
 R/alter.r                     | 205 ++++++++++++++++++++++-------
 R/check.r                     |  19 +--
 R/convert.r                   |  84 ++++++++++--
 R/munsell.r                   |  12 +-
 R/plot.r                      | 292 +++++++++++++++++++++++++-----------------
 R/sysdata.rda                 | Bin 53934 -> 53940 bytes
 README.md                     |  72 +++++++++++
 inst/raw/getmunsellmap.R      |   8 +-
 man/check_mnsl.Rd             |  21 ++-
 man/chroma_slice.Rd           |  20 +--
 man/complement.Rd             |  17 ++-
 man/complement_slice.Rd       |  13 +-
 man/darker.Rd                 |  19 ++-
 man/desaturate.Rd             |  18 ++-
 man/fix_mnsl.Rd               |  18 +--
 man/hue_slice.Rd              |  14 +-
 man/hvc2mnsl.Rd               |  39 +++---
 man/in_gamut.Rd               |  22 ++--
 man/lighter.Rd                |  21 ++-
 man/mnsl.Rd                   |  37 +++---
 man/mnsl2hvc.Rd               |  38 ++++++
 man/mnsl_hues.Rd              |   9 +-
 man/munsell.Rd                |  11 +-
 man/pbgyr.Rd                  |  25 ++++
 man/plot_closest.Rd           |  25 ++--
 man/plot_hex.Rd               |  14 +-
 man/plot_mnsl.Rd              |  20 ++-
 man/rgb2mnsl.Rd               |  19 +--
 man/rygbp.Rd                  |  25 ++++
 man/saturate.Rd               |  18 ++-
 man/seq_mnsl.Rd               |  23 ++--
 man/text_colour.Rd            |  11 +-
 man/theme_munsell.Rd          |   8 +-
 man/value_slice.Rd            |  15 ++-
 tests/testthat.R              |   3 +
 tests/testthat/test-alter.R   |  78 +++++++++++
 tests/testthat/test-convert.R |  12 ++
 42 files changed, 999 insertions(+), 428 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index c58b117..eeefd49 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,16 +1,20 @@
 Package: munsell
 Type: Package
-Title: Munsell colour system
-Version: 0.4.2
+Title: Utilities for Using Munsell Colours
+Version: 0.4.3
 Author: Charlotte Wickham <cwickham at gmail.com>
 Maintainer: Charlotte Wickham <cwickham at gmail.com>
-Description: Functions for exploring and using the Munsell
-    colour system
-Suggests: ggplot2 (>= 0.9.2)
-Imports: colorspace
+Description: Provides easy access to, and manipulation of, the Munsell 
+    colours. Provides a mapping between Munsell's 
+    original notation (e.g. "5R 5/10") and hexadecimal strings suitable 
+    for use directly in R graphics. Also provides utilities 
+    to explore slices through the Munsell colour tree, to transform 
+    Munsell colours and display colour palettes.
+Suggests: ggplot2, testthat
+Imports: colorspace, methods
 License: MIT + file LICENSE
-Collate: 'alter.r' 'check.r' 'convert.r' 'munsell.r' 'plot.r'
-Packaged: 2013-07-08 19:19:22 UTC; wickhamc
+RoxygenNote: 5.0.1
 NeedsCompilation: no
+Packaged: 2016-02-12 19:58:18 UTC; wickhamc
 Repository: CRAN
-Date/Publication: 2013-07-11 20:15:53
+Date/Publication: 2016-02-13 00:46:00
diff --git a/LICENSE b/LICENSE
index 07bcce3..9c0478a 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,2 +1,2 @@
-YEAR: 2013
+YEAR: 2016
 COPYRIGHT HOLDER: Charlotte Wickham
\ No newline at end of file
diff --git a/MD5 b/MD5
index 06b776e..d37a34d 100644
--- a/MD5
+++ b/MD5
@@ -1,36 +1,43 @@
-389bfcde01b71e98d93b8ed8c1b48862 *DESCRIPTION
-c720cf09c40daf3a0bdc9db678983a7d *LICENSE
-a404b9eebb7ec6368c98f812ca478ce3 *NAMESPACE
-92b83b21ce58b53a38bc6ddd66d5b82d *NEWS
-171797784068db5819bff9174a530742 *R/alter.r
-49827aff51f633348b17a70f4678d81f *R/check.r
-fe0d8199f684268d1cf6f0b396f8c6ef *R/convert.r
-7573344c1fd851fb51ae252a4801bed1 *R/munsell.r
-bc49263be50c3ee16fd3fbf47fc16aa1 *R/plot.r
-ac56e1ebdaadd8948c7ad6242ce417ce *R/sysdata.rda
-ae61fcf5622bde66874ff9817175fea8 *inst/raw/getmunsellmap.R
+b529a9cd7ed8ff85d38812a1fbebaa4f *DESCRIPTION
+87ef3467fce6d5a255c09d2c0f4e980b *LICENSE
+f2b196714119df71068365d96a78adca *NAMESPACE
+9d107514352b78ffcf3ccab7620a36af *NEWS.md
+1eba030243b78f1b2ee322b9b56fbd82 *R/alter.r
+c385fffc4bf275ee9d376f9f2fbdf28b *R/check.r
+84136b509afe014941d22dca629fea48 *R/convert.r
+0c0d5c63bdba8c43db46acb682c79f98 *R/munsell.r
+edcd785aa8fe3af6c9ca9b97c7092db7 *R/plot.r
+a5f63509303f8527dcb119cbbf5c1dd2 *R/sysdata.rda
+5f98b36aebc4125d509e4d60a8f7666c *README.md
+4c45c679a2b7365d48ee7f168b37ce77 *inst/raw/getmunsellmap.R
 1a50e408003768c47b8ee59f96daf9f6 *inst/raw/greys.dat
 17ec52f21d55878850b4323ab28122d3 *inst/raw/real.dat
-ead1fe4f25e786697bbfe9d86c4f6687 *man/check_mnsl.Rd
-2869fb4328548b655dd7a0f74ce6eb8d *man/chroma_slice.Rd
-8d03c77f0bb9b11a2bc45a72361b3ea0 *man/complement.Rd
-9e3abd017167a638488589c7c472356e *man/complement_slice.Rd
-9b5bedcf6af88917cab1f91356d7f1dc *man/darker.Rd
-46512510acecd1ca66ae23facc878109 *man/desaturate.Rd
-ec9f3b193186b387f87319fd46cf2c74 *man/fix_mnsl.Rd
-18710296757aaa5a19d4bf63f17eec9c *man/hue_slice.Rd
-47848efc21506f2bd34097a1e7758929 *man/hvc2mnsl.Rd
-2b34b5562ac568bf22a0e14368e2ff47 *man/in_gamut.Rd
-059650316af6543e0a03a428f01508f1 *man/lighter.Rd
-e4132dba7b8781c9bbaed52a3fb24697 *man/mnsl.Rd
-3a83faa6b296c306e2c0ba3371355e00 *man/mnsl_hues.Rd
-ee5cb3131be5bdadace4721d9b4c981d *man/munsell.Rd
-5a23098c3f8ae7fb8418808c8652345d *man/plot_closest.Rd
-20cae4cf7b177b6708066eedfe574b9e *man/plot_hex.Rd
-536d2edc9f9b08fa895660c667ecacec *man/plot_mnsl.Rd
-279310bb2213d4ba5db9262a6910d18b *man/rgb2mnsl.Rd
-847385746ad472dc6d135818e8eebb9e *man/saturate.Rd
-3a4591cd390b802794012a3aaff7cb00 *man/seq_mnsl.Rd
-cd286aae131cdb8759dc0bf8cb99078a *man/text_colour.Rd
-997e0ca16ef6590ca12af5019a28f33c *man/theme_munsell.Rd
-d6cb894c3dd70d07a67d0e553a39254b *man/value_slice.Rd
+f9721be8a64b25360959b6c2534c9b81 *man/check_mnsl.Rd
+3b2c933fdf0b300d5d8e86e749607ef9 *man/chroma_slice.Rd
+b4a6ddaafda3120626f7ed9970f4b173 *man/complement.Rd
+bb63127049e66934cf9a1a3dadeec19a *man/complement_slice.Rd
+6078d37f2c28e01a8a12fa19938f1ef1 *man/darker.Rd
+3cfeb41bab1f849348246a199a935761 *man/desaturate.Rd
+8600ad0e05320570bd948a7dabac0674 *man/fix_mnsl.Rd
+61e18e38d7e53b68ffecd8dad053359e *man/hue_slice.Rd
+2853d29ea8d261330bd820af75699b3f *man/hvc2mnsl.Rd
+3c6da218c28ca6226b4f23c0754357ef *man/in_gamut.Rd
+07bc24322c72b341bd1df98e65d84e0e *man/lighter.Rd
+49168eba5fabb4df345130d82f386b20 *man/mnsl.Rd
+6387c1cbbf852b74e5b1531842933663 *man/mnsl2hvc.Rd
+17154a8594319f7b9873b455fa6a2bbf *man/mnsl_hues.Rd
+226294cbb387c94849e23931c2031014 *man/munsell.Rd
+62a075938ef24ae48a0b1f4703fbd4ed *man/pbgyr.Rd
+a8306bff7ac2734253ac629105f5fa72 *man/plot_closest.Rd
+81daeb5d8788772c2daa6e15bc8557fc *man/plot_hex.Rd
+0f0c7330a9725d0e037a44a316c985e6 *man/plot_mnsl.Rd
+edac9eb7ace39737c17814662c102fff *man/rgb2mnsl.Rd
+ddd991310c9510cc47cd78ed7f87cb15 *man/rygbp.Rd
+ede2ac70f96f467aaecee17114c5191b *man/saturate.Rd
+9c6be07f66a03725408d4d2c5bed376a *man/seq_mnsl.Rd
+b506eb92ea3290c3df7e97e53a635f16 *man/text_colour.Rd
+6674b94e75800c00af9cdbf22e0f4332 *man/theme_munsell.Rd
+94bb8c5fe0041ecec376cd222da72275 *man/value_slice.Rd
+793adaa149c94009bab8e335b413b9f8 *tests/testthat.R
+0b91378a76c507aa56d6a981ba2a3b78 *tests/testthat/test-alter.R
+bda817290cbf2bac4e3746d83ff3381a *tests/testthat/test-convert.R
diff --git a/NAMESPACE b/NAMESPACE
index d105fdc..7285559 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -1,3 +1,5 @@
+# Generated by roxygen2: do not edit by hand
+
 export(check_mnsl)
 export(chroma_slice)
 export(complement)
@@ -11,13 +13,18 @@ export(in_gamut)
 export(lighter)
 export(mnsl)
 export(mnsl2hex)
+export(mnsl2hvc)
 export(mnsl_hues)
+export(pbgyr)
 export(plot_closest)
 export(plot_hex)
 export(plot_mnsl)
 export(rgb2mnsl)
+export(rygbp)
 export(saturate)
 export(seq_mnsl)
 export(text_colour)
 export(value_slice)
 import(colorspace)
+importFrom(methods,as)
+importFrom(stats,na.exclude)
diff --git a/NEWS b/NEWS.md
similarity index 66%
rename from NEWS
rename to NEWS.md
index 9032744..5b72750 100644
--- a/NEWS
+++ b/NEWS.md
@@ -1,3 +1,19 @@
+Version 0.4.3
+==============================================================================
+* many fixes to remove R CMD check notes/warnings fixes issue (#5)
+
+* fix bug that gave incorrect greys 
+
+* add functions rygbp and pbgyr to change the hue of a colour
+
+* add function mnsl2hvc to pull apart a munsell string
+
+* reimplement altering functions to make use of mnsl2hvc and hvc2mnsl
+
+* fix plot_mnsl to show multiple swatches of identical colour
+
+* lighter, darker, saturate and desaturate take an additional argument 'steps' to specify how many steps to take.
+
 Version 0.4.2
 ==============================================================================
 
diff --git a/R/alter.r b/R/alter.r
index df931ad..c617f0e 100644
--- a/R/alter.r
+++ b/R/alter.r
@@ -1,95 +1,153 @@
 #' Make a munsell colour lighter
 #'
-#' Increases the value of the Munsell colour by 1.
+#' Increases the value of the Munsell colour. 
 #' @param col character vector of Munsell colours
+#' @param steps number of steps to take in increasing value
 #' @return character vector of Munsell colours
 #' @export
+#' @importFrom stats na.exclude
 #' @examples 
 #' lighter("5PB 2/4")
-#' cols <- c("5PB 2/4", "5Y 7/8")
-#' plot_mnsl(c(cols, lighter(cols)))
-lighter <- function(col){
-  col.split <- lapply(strsplit(col, "/"), 
-    function(x) unlist(strsplit(x, " ")))
-  unlist(lapply(col.split, function(x) 
-    paste(x[1], " ", as.numeric(x[2]) + 1,"/", x[3] , sep = "")))  
+#' cols <- c("5PB 2/4", "5Y 6/8")
+#' p <- plot_mnsl(c(cols, lighter(cols), lighter(cols, 2)))
+#' p + ggplot2::facet_wrap(~ names, ncol = 2)
+#' # lighter and darker are usually reversible
+#' lighter(darker("5PB 2/4"))
+#' # unless you try to pass though white or black
+#' lighter(darker("5PB 1/4"))
+lighter <- function(col, steps = 1){
+  col <- na.exclude(col)
+  col_hvc <- mnsl2hvc(as.vector(col))
+  
+  col_hvc[, "value"] <- col_hvc[, "value"] + steps
+  # check edge cases
+  whites <- col_hvc[, "value"] >= 10
+  blacks <- col_hvc[, "value"] <= 0
+  if (any(whites | blacks)){
+    col_hvc[whites, "hue"] <- "N"
+    col_hvc[whites, "value"] <- 10
+    col_hvc[whites, "chroma"] <- 0
+    col_hvc[blacks, "hue"] <- "N"
+    col_hvc[blacks, "value"] <- 0
+    col_hvc[blacks, "chroma"] <- 0
+  }
+  na_handle(col, hvc2mnsl(col_hvc))
+}
+
+na_handle <- function(naobj, res){
+  nas <- attr(naobj, "na.action")
+  if(is.null(nas)) return(res)
+  
+  if (is.vector(res) & is.vector(as.vector(naobj))){
+    keep <- rep(NA, length(naobj) + length(nas))
+    stopifnot(length(naobj) == length(res))
+    keep[-nas] <- 1:length(res)
+    result <- res[keep] 
+  } else if(is.data.frame(res) & is.vector(as.vector(naobj))){
+    keep <- rep(NA, length(naobj) + length(nas))
+    stopifnot(length(naobj) == nrow(res))
+    keep[-nas] <- 1:nrow(res)
+    result <- res[keep, ]
+  } else if(is.vector(res) & is.data.frame(naobj)){
+    keep <- rep(NA, nrow(naobj) + length(nas))
+    stopifnot(nrow(naobj) == length(res))
+    keep[-nas] <- 1:length(res)
+    result <- res[keep]
+  } else if (is.data.frame(res) & is.data.frame(naobj)){
+    keep <- rep(NA, nrow(naobj) + length(nas))
+    stopifnot(nrow(naobj) == nrow(res))
+    keep[-nas] <- 1:nrow(res)
+    result <- res[keep, ]
+  }
+  
+  result
 }
 
 #' Make a munsell colour darker
 #'
 #' Decreases the value of the Munsell colour by 1.
 #' @param col character vector of Munsell colours
+#' @param steps number of steps to take in decreasing value
 #' @return character vector of Munsell colours
 #' @export
 #' @examples 
-#' darker("5PB 2/4")
-#' cols <- c("5PB 2/4", "5Y 7/8")
-#' plot_mnsl(c(cols, darker(cols)))
-darker <- function(col){
-  col.split <- lapply(strsplit(col, "/"), 
-    function(x) unlist(strsplit(x, " ")))
-  unlist(lapply(col.split, function(x) 
-    paste(x[1], " ", as.numeric(x[2]) - 1,"/", x[3] , sep = "")))  
+#' darker("5PB 3/4")
+#' cols <- c("5PB 3/4", "5Y 7/8")
+#' p <- plot_mnsl(c(cols, darker(cols), darker(cols, 2)))
+#' p + ggplot2::facet_wrap(~ names, ncol = 2)
+darker <- function(col, steps = 1){
+  lighter(col, steps = -steps)
 }
 
 #' Make a munsell colour more saturated
 #'
-#' Increases the chroma of the Munsell colour by one step (+ 2).
+#' Increases the chroma of the Munsell colour by step steps (multiples of 2).
 #' @param col character vector of Munsell colours
+#' @param steps number of steps to take in increasing chroma
 #' @return character vector of Munsell colours
 #' @export
+#' @importFrom stats na.exclude
 #' @examples
 #' saturate("5PB 2/4")
-#' cols <- c("5PB 2/4", "5Y 7/8")
-#' plot_mnsl(c(cols, saturate(cols)))
-saturate <- function(col){
-  col.split <- lapply(strsplit(col, "/"), 
-    function(x) unlist(strsplit(x, " ")))
-  unlist(lapply(col.split, function(x) 
-    paste(x[1], " ", x[2], "/", as.numeric(x[3]) + 2, sep = "")))  
+#' cols <- c("5PB 2/2", "5Y 7/6")
+#' p <- plot_mnsl(c(cols, saturate(cols), saturate(cols, 2)))
+#' p + ggplot2::facet_wrap(~ names, ncol = 2)
+saturate <- function(col, steps = 1){
+  col <- na.exclude(col)
+  
+  col_hvc <- mnsl2hvc(as.vector(col))
+  col_hvc[, "chroma"] <- col_hvc[, "chroma"] + 2*steps
+  greys <- col_hvc[, "chroma"] <= 0
+  if (any(greys)){
+    col_hvc[greys, "hue"] <- "N"
+    col_hvc[greys, "chroma"] <- 0
+  }  
+  na_handle(col, hvc2mnsl(col_hvc))
 }
 
 #' Make a munsell colour less saturated
 #'
-#' Decreases the chroma of the Munsell colour by one step (- 2).
+#' Decreases the chroma of the Munsell colour by one step steps (multiples of 2).
 #' @param col character vector of Munsell colours
+#' @param steps number of steps to take in decreasing chroma
 #' @return character vector of Munsell colours
 #' @export
 #' @examples 
 #' desaturate("5PB 2/4")
-#' cols <- c("5PB 2/4", "5Y 7/8")
-#' plot_mnsl(c(cols, desaturate(cols)))
-desaturate <- function(col){
-  col.split <- lapply(strsplit(col, "/"), 
-    function(x) unlist(strsplit(x, " ")))
-  unlist(lapply(col.split, function(x) 
-    paste(x[1], " ", x[2], "/", as.numeric(x[3]) - 2, sep = "")))  
+#' cols <- c("5PB 2/6", "5Y 7/8")
+#' p <- plot_mnsl(c(cols, desaturate(cols), desaturate(cols, 2)))
+#' p + ggplot2::facet_wrap(~ names, ncol = 2)
+desaturate <- function(col, steps = 1){
+  saturate(col, steps = -steps)
 }
 
 #' Find the complement of a munsell colour 
 #'
 #' Finds the munsell colour with the same chroma and value but on the opposite
-#' side of the hue circle.
+#' side of the hue circle. The complement is not defined 
+#' for greys (hue == "N"), and the function returns the grey untransformed.
 #' @param col character vector of Munsell colours
 #' @param ... passed on to \code{\link{in_gamut}}. Use \code{fix = TRUE} to
 #' fix "bad" complement
 #' @return character vector of Munsell colours
 #' @export
+#' @importFrom stats na.exclude
 #' @examples 
 #' complement("5PB 2/4")
 #' cols <- c("5PB 2/4", "5Y 7/8")
 #' plot_mnsl(c(cols, complement(cols)))
 complement <- function(col, ...){
-  col <- check_mnsl(col, ...)
-  col.split <- lapply(strsplit(col, "/"), 
-    function(x) unlist(strsplit(x, " ")))
-  hues <- levels(munsell.map$hue)[-1]
-
-  comps <- unlist(lapply(col.split, function(x) {
-      hue.index <- match(x[1],  hues)
-      paste(hues[(hue.index + 20) %% 40], " ", x[2], "/", x[3], sep = "")
-    }))
-  in_gamut(comps, ...)
+  col <- na.exclude(col)
+  
+  col_hvc <- mnsl2hvc(as.vector(col))
+  greys <- col_hvc[, "hue"] == "N"
+  inds <- match(col_hvc$hue, mnsl_hues())
+  col_hvc[, "hue"] <-  mnsl_hues()[((inds + 20 -1) %% 40) + 1]
+  if (any(greys)){
+    warning("Complement not defined for greys")
+    col_hvc[greys, "hue"] <- "N"
+  }
+  na_handle(col, hvc2mnsl(col_hvc))
 }
 
 #' Generate a sequence of Munsell colours
@@ -99,16 +157,67 @@ complement <- function(col, ...){
 #' @param from character string of first Munsell colour
 #' @param to character string of last Munsell colour
 #' @param n number of colours in sequence
+#' @param fix Should colours outside of the gamut be fixed? 
+#' Passed on to \code{\link{fix_mnsl}}
 #' @return character vector of Munsell colours
 #' @export
+#' @importFrom methods as
 #' @examples
 #' seq_mnsl("5R 2/4", "5R 5/16", 4)
 #' plot_mnsl(seq_mnsl("5R 2/4", "5R 5/16", 4))
-#' plot_mnsl(seq_mnsl("5R 2/4", complement("5R 2/4", fix = TRUE), 5))
-seq_mnsl <- function(from, to, n){
-  in.LUV <- munsell.map[match(c(from, to), munsell.map$name), c("L", "U", "V")]
+#' plot_mnsl(seq_mnsl("5R 5/6", 
+#'   complement("5R 5/6"), 5))
+seq_mnsl <- function(from, to, n, fix = FALSE){
+  cols <- in_gamut(c(from, to), fix = fix)
+  if(any(is.na(cols))) stop("Colors must be in gamut")
+  in.LUV <- munsell.map[match(cols, munsell.map$name), c("L", "U", "V")]
   LUV.seq <- matrix(c(seq(in.LUV$L[1], in.LUV$L[2],  length = n), 
     seq(in.LUV$U[1], in.LUV$U[2],  length = n), 
     seq(in.LUV$V[1], in.LUV$V[2],  length = n)),  ncol = 3)
-  rgb2mnsl(as(LUV(LUV.seq), "RGB")@coords)
-}
\ No newline at end of file
+  rgb2mnsl(as(LUV(LUV.seq), "sRGB")@coords)
+}
+
+
+
+#' Change the hue of a munsell colour
+#'
+#' Moves the hue of a munsell colour in the direction red->yellow->green->blue->purple->red
+#' @param col character vector of Munsell colours
+#' @param steps number of hue steps to take
+#' @return character vector of Munsell colours
+#' @export
+#' @importFrom stats na.exclude
+#' @examples 
+#' my_red <- "10R 4/8"
+#' rygbp(my_red)
+#' plot_mnsl(c(my_red, rygbp(my_red, 2), rygbp(my_red, 4)))
+rygbp <- function(col, steps = 1){
+  col <- na.exclude(col)
+  
+  col_hvc <- mnsl2hvc(as.vector(col))
+  greys <- col_hvc[, "hue"] == "N"
+
+  inds <- match(col_hvc$hue, mnsl_hues())
+  col_hvc[, "hue"] <-  mnsl_hues()[((inds + steps -1) %% 40) + 1]
+  if (any(greys)){
+    warning("Greys returned untransformed")
+    col_hvc[greys, "hue"] <- "N"
+  }
+  
+  na_handle(col, hvc2mnsl(col_hvc))
+}
+
+#' Change the hue of a munsell colour
+#'
+#' Moves the hue of a munsell colour in the direction purple->blue->green->yellow->red->purple
+#' @param col character vector of Munsell colours
+#' @param steps number of hue steps to take
+#' @return character vector of Munsell colours
+#' @export
+#' @examples 
+#' my_red <- "2.5R 4/8"
+#' pbgyr(my_red)
+#' plot_mnsl(c(my_red, pbgyr(my_red, 2), pbgyr(my_red, 4)))
+pbgyr <- function(col, steps = 1){
+  rygbp(col, steps = -steps)
+}
diff --git a/R/check.r b/R/check.r
index 4817302..9d747b0 100644
--- a/R/check.r
+++ b/R/check.r
@@ -11,9 +11,11 @@
 #' @examples 
 #' check_mnsl(c("5R 5/8","2.5R 9/28"))
 #' @keywords internal
-check_mnsl <- function(col,  fix = FALSE){
-  missing <- is.na(col)
-  col <- toupper(col[!missing])
+#' @importFrom methods as
+#' @importFrom stats na.exclude
+check_mnsl <- function(col){
+  col_na <- na.exclude(col)
+  col <- toupper(as.vector(col_na))
   # check format
   right.format <- grep("^[N]|([0-9]?.?[0-9][A-Z]{1,2})[ ][0-9]?.?[0-9]/[0-9]?.?[0-9]{1,2}$",
     col)
@@ -62,10 +64,7 @@ check_mnsl <- function(col,  fix = FALSE){
     stop("some colours have chromas that are not multiples of two: ",
       bad.chroma)
   }
-  col <- in_gamut(col,  fix = fix)
-  result <- rep(NA,  length(missing))
-  result[!missing] <- col
-  result
+  na_handle(col_na, col)
 }
 
 #' Checks if a Munsell colour is defined in RGB space
@@ -79,10 +78,12 @@ check_mnsl <- function(col,  fix = FALSE){
 #' @return  a character vector containing the input colours.  If any colours
 #' were outside the gamut they will be represented by NA.
 #' @export
+#' @importFrom stats na.exclude
 #' @examples 
 #' in_gamut(c("5R 5/8","2.5R 9/28"))
 #' @keywords internal
 in_gamut <- function(col, fix = FALSE){
+  col <- na.exclude(col)
   positions <- match(col, munsell.map$name)
   hex <- munsell.map[positions, "hex"]
   if(any(is.na(hex))){
@@ -95,7 +96,7 @@ in_gamut <- function(col, fix = FALSE){
       col[is.na(hex)] <- fix_mnsl(col[is.na(hex)])
     }
   }
-  col
+  na_handle(col, as.vector(col))
 }
 #' Fix an undefined Munsell colour
 #'
@@ -123,7 +124,7 @@ fix_mnsl <- function(col){
 #' Munsell hues
 #'
 #' Returns a character vector of the Munsell hues in hue order starting at 2.5R and excluding grey ("N").
-#' @return  a character vector containing the fixed colours.
+#' @return  a character vector containing the hue values.
 #' @export
 #' @examples 
 #' mnsl_hues()
diff --git a/R/convert.r b/R/convert.r
index 764ec37..4676813 100644
--- a/R/convert.r
+++ b/R/convert.r
@@ -19,9 +19,8 @@
 #' @examples
 #' mnsl2hex("5PB 5/10")
 #' # use a munsell colour in a plot
-#' require("ggplot2")
-#' ggplot(data.frame(x = 1:10)) + geom_point(aes(x = x, y = x), 
-#'   colour = mnsl2hex("5PB 5/10"))
+#' plot.new()
+#' rect(0, 0, 1 ,1 , col = mnsl("5R 5/10"))
 mnsl <- function(col, ...){
   col <- check_mnsl(col, ...)
   positions <- match(col, munsell.map$name)
@@ -40,7 +39,8 @@ mnsl2hex <- mnsl
 #' this package value should be an integer in 0:10 and chroma an even number
 #' at most 24.  Note that not all possible specifications result in 
 #' representable colours.  Regular recycling rules apply.
-#' @param hue a character vector of Munsell hues
+#' @param hue a character vector of Munsell hues, or a 3 column data frame
+#' containing the hue value and chroma levels
 #' @param value a numeric vector of values
 #' @param chroma a numeric vector of chromas
 #' @param ... passed on to \code{\link{check_mnsl}}. Use \code{fix = TRUE} to
@@ -48,20 +48,62 @@ mnsl2hex <- mnsl
 #' @return a character string specification of a hex colour
 #' @seealso \code{\link{check_mnsl}}, \code{\link{mnsl2hex}}
 #' @export
+#' @importFrom stats na.exclude
 #' @examples
 #' hvc2mnsl("5PB", 5, 10)
 #' # All values of 5PB with chroma 10
 #' hvc2mnsl("5PB", 1:9, 10) # note some are undefined
-#' plot_mnsl(hvc2mnsl("5PB", 1:9, 2))
-hvc2mnsl <- function(hue, value, chroma, ...){
-  selected <- paste(hue, " ", value, "/", chroma,  sep = "")
+#' plot_mnsl(hvc2mnsl("5PB", 1:9, 10))
+hvc2mnsl <- function(hue, value = NULL, chroma = NULL, ...){
+  if(!(is.null(value) == is.null(chroma))) stop("specify both value and chroma")
+  hcv <- hue
+  if(!is.null(value)) {
+    hcv <- cbind(hcv, value, chroma)
+  }
+  hcv <- na.exclude(hcv)
+  selected <- paste(hcv[, 1], " ", hcv[, 2], "/", hcv[, 3],  sep = "")
   selected <- check_mnsl(selected, ...)
-  selected
+  na_handle(hcv, selected)
 }
 
-#' Converts an RGB colour to Munsell
+#' Converts a Munsell colour to a hue, chroma and value triplet
 #'
-#' Finds the closest Munsell colour (in LUV space) to the specified RGB colour
+#' Takes a text specification of a Munsell colour and returns
+#' the hue, chroma and value triplet.
+#'
+#' Munsell colours are specified by hue, value and chroma.  They 
+#' take a form like "5PB 5/10" where the first characters represent the
+#' hue, followed by a space then the value and chroma separated by a "/". In
+#' this package value should be an integer in 0:10 and chroma an even number
+#' at most 24.  Note that not all possible specifications result in 
+#' representable colours. 
+#' @param col a character vector of Munsell colours
+#' @param ... passed on to \code{\link{check_mnsl}}. Use \code{fix = TRUE} to
+#' fix "bad" colours
+#' @return a data frame with named columns hue, value and chroma containing the hue,
+#' value and chroma levels.
+#' @seealso \code{\link{check_mnsl}}, \code{\link{hvc2mnsl}}
+#' @importFrom stats na.exclude
+#' @export
+#' @examples
+#' mnsl2hvc("5PB 5/10")
+#' hvc2mnsl(mnsl2hvc("5PB 5/10"))
+mnsl2hvc <- function(col, ...){
+  col <- check_mnsl(col, ...)
+  col <- na.exclude(col)
+  if (length(col) == 0) stop("zero non-missing colours")
+  col.split <- lapply(strsplit(col, "/"), 
+    function(x) unlist(strsplit(x, " ")))
+  col_mat <- data.frame(do.call(rbind, col.split),
+    stringsAsFactors = FALSE)
+  colnames(col_mat) <- c("hue", "value", "chroma")
+  col_mat[, "value"] <- as.numeric(col_mat[, "value"])
+  col_mat[, "chroma"] <- as.numeric(col_mat[, "chroma"])
+  na_handle(col, col_mat)
+}
+#' Converts an sRGB colour to Munsell
+#'
+#' Finds the closest Munsell colour (in LUV space) to the specified sRGB colour
 #'
 #' @param R a numeric vector of red values or a 3 column matrix with the
 #' proportions R,  G,  B in the columns.
@@ -69,12 +111,17 @@ hvc2mnsl <- function(hue, value, chroma, ...){
 #' @param B numeric vector of blue values
 #' @seealso \code{\link{plot_closest}}
 #' @export
+#' @importFrom methods as
 #' @examples
 #' rgb2mnsl(0.1, 0.1, 0.3)
 #' rgb2mnsl(matrix(c(.1, .2, .4, .5, .6, .8),  ncol = 3))
 #' plot_closest(matrix(c(.1, .2, .4, .5, .6, .8),  ncol = 3))
 rgb2mnsl <- function(R, G = NULL, B = NULL){
-    LUV.vals <- as(RGB(R, G, B), "LUV")@coords
+    LUV.vals <- as(sRGB(R, G, B), "LUV")@coords
+    # check for black
+    if (any(LUV.vals[,"L"] == 0)){
+      LUV.vals[LUV.vals[,"L"] == 0, ] <- 0
+    }
     ncolors <- nrow(LUV.vals)
     dist.calc <- function(x, y) rowSums((rep(x, each = ncolors) - y) ^ 2)
     dists <- apply(munsell.map[, c("L", "U", "V")], 1, dist.calc, y = LUV.vals)
@@ -82,3 +129,18 @@ rgb2mnsl <- function(R, G = NULL, B = NULL){
     else closest <- apply(dists, 1, which.min)
     munsell.map[closest, "name"]
 }
+
+RGB2mnsl <- function(rgb.cols){
+  LUV.vals <- as(rgb.cols, "LUV")@coords
+  # check for black
+  if (any(LUV.vals[,"L"] == 0)){
+    LUV.vals[LUV.vals[,"L"] == 0, ] <- 0
+  }
+  ncolors <- nrow(LUV.vals)
+  dist.calc <- function(x, y) rowSums((rep(x, each = ncolors) - y) ^ 2)
+  dists <- apply(munsell.map[, c("L", "U", "V")], 1, dist.calc, y = LUV.vals)
+  if(is.null(dim(dists)))  closest <- which.min(dists)
+  else closest <- apply(dists, 1, which.min)
+  munsell.map[closest, "name"]
+}
+
diff --git a/R/munsell.r b/R/munsell.r
index aa0a22a..8371982 100644
--- a/R/munsell.r
+++ b/R/munsell.r
@@ -1,10 +1,16 @@
 #' Munsell colour system.
 #' 
+#' @description 
 #' This package makes it easy to access and manipulate the colours in the 
-#' munsell colour system.
-#' 
+#' munsell colour system. The conversion from munsell specifications to sRGB based on the renotation data from  \url{http://www.cis.rit.edu/mcsl/online/munsell.php} which is a digitization of Table 1 in Newhall, Nickerson & Judd (1943).  The code for conversion can be found in the package directory in inst/raw/getmunsellmap.r
+#' @references S. M. Newhall, D. Nickerson, and D. B. Judd. Final report of the O.S.A. subcommittee on the spacing of the munsell colors. J. Opt. Soc. Am., 33(7):385-411, 07 1943.
+#' @references Munsell Renotation Data, RIT Munsell Color Science Laboratory.  \url{http://www.cis.rit.edu/mcsl/online/munsell.php}
 #' @docType package
 #' @name munsell
 #' @aliases munsell package-munsell
 #' @import colorspace
-NULL
\ No newline at end of file
+NULL
+
+
+globalVariables(c("hue", "value", "chroma", "name",
+  "x", "y", "text.colour", "colour"))
\ No newline at end of file
diff --git a/R/plot.r b/R/plot.r
index 4d8b48b..96f94b5 100644
--- a/R/plot.r
+++ b/R/plot.r
@@ -3,20 +3,20 @@
 #' Removes unnecessary clutter in plots
 #' @keywords internal
 #' @param bg.col takes colour to use as background colour
-theme_munsell <- function(bg.col) {
-    theme(
-      panel.grid.major = element_line(colour = NA),
-      panel.grid.minor = element_line(colour = NA),
-      panel.background = element_rect(fill = bg.col), 
-      plot.background = element_blank(), 
-      axis.line = element_line(colour = NA), 
-      axis.ticks = element_blank(),
-      axis.text = element_blank(),
-      axis.title = element_blank(),
-      legend.background = element_blank(),
-      legend.key = element_blank(),
-      legend.text = element_text(),
-      legend.title = element_text())
+theme_munsell <- function(bg.col = "white") {
+    ggplot2::theme(
+      panel.grid.major = ggplot2::element_line(colour = NA),
+      panel.grid.minor = ggplot2::element_line(colour = NA),
+      panel.background = ggplot2::element_rect(fill = bg.col), 
+      plot.background = ggplot2::element_blank(), 
+      axis.line = ggplot2::element_line(colour = NA), 
+      axis.ticks = ggplot2::element_blank(),
+      axis.text = ggplot2::element_blank(),
+      axis.title = ggplot2::element_blank(),
+      legend.background = ggplot2::element_blank(),
+      legend.key = ggplot2::element_blank(),
+      legend.text = ggplot2::element_text(),
+      legend.title = ggplot2::element_text())
 }
 
 
@@ -31,18 +31,24 @@ theme_munsell <- function(bg.col) {
 #' plot_hex("#000000")
 #' plot_hex(c("#000000","#FFFFFF"))
 plot_hex <- function(hex.colour,  back.col = "white"){
-  require("ggplot2")
-  if(length(hex.colour) == 1) add.ops <- list(geom_text(aes(label = names)))
-  else add.ops <- list(facet_wrap(~ names))
+  if (!requireNamespace("ggplot2", quietly = TRUE)) {
+    stop("ggplot2 needed for this function to work. Please install it.",
+      call. = FALSE)
+  }
+  if(length(hex.colour) == 1) {
+    add.ops <- list(ggplot2::geom_text(ggplot2::aes(label = names)))
+  }
+  else add.ops <- list(ggplot2::facet_wrap(~ names))
   
   df <- data.frame(colour = hex.colour, 
                    names = factor(hex.colour, levels=hex.colour), 
                    x = 0, y = 0)
-  ggplot(data = df,  aes(x = x,  y = y)) + geom_tile(aes(fill = colour)) + 
-     scale_fill_identity() + add.ops + 
-     scale_x_continuous(expand = c(0, 0))+
-     scale_y_continuous(expand = c(0, 0))+
-     coord_fixed(ratio = 1) + theme_munsell(back.col)    
+  ggplot2::ggplot(data = df,  ggplot2::aes(x = x,  y = y)) + 
+    ggplot2::geom_tile(ggplot2::aes(fill = colour)) + 
+    ggplot2::scale_fill_identity() + add.ops + 
+    ggplot2::scale_x_continuous(expand = c(0, 0)) +
+    ggplot2::scale_y_continuous(expand = c(0, 0)) +
+    ggplot2::coord_fixed(ratio = 1) + theme_munsell(back.col)    
 }
 
 #' Plot a munsell colour
@@ -61,24 +67,36 @@ plot_hex <- function(hex.colour,  back.col = "white"){
 #' p
 #' # returned object is a ggplot object so we can alter the layout
 #' summary(p)
-#' p + facet_wrap(~ names, nrow = 1)
+#' p + ggplot2::facet_wrap(~ num, nrow = 1)
 plot_mnsl <- function(cols,  back.col = "white", ...){
-  require("ggplot2")
-
-  if(length(cols) == 1) {add.ops <- list(
-    geom_text(aes(label = names, colour = text_colour(as.character(names)))), 
-    scale_colour_identity())}
-  else add.ops <- list(facet_wrap(~ names))
-  cols <- check_mnsl(cols, ...)
-  df <- data.frame(names = factor(cols, levels = cols),  
-    hex = mnsl2hex(cols), x = 0 , y = 0)
-  ggplot(data = df,  aes(x = x,  y = y)) + geom_tile(aes(fill = hex)) + 
+  if (!requireNamespace("ggplot2", quietly = TRUE)) {
+    stop("ggplot2 needed for this function to work. Please install it.",
+      call. = FALSE)
+  }
+  add.ops <- NULL
+  if(length(cols) > 1) {
+     add.ops <- list(ggplot2::facet_wrap(~ num))
+  }
+  cols <- check_mnsl(cols)
+  cols <- in_gamut(cols, ...)
+  df <- data.frame(num = 1:length(cols), 
+    names = factor(cols,  levels = c(unique(cols))),
+    hex = mnsl2hex(cols), x = 0 , y = 0, stringsAsFactors = FALSE)
+  df$labels <- factor(df$names,  levels = c(unique(cols), "NA"))
+  df$labels[is.na(df$labels)] <- "NA"
+  ggplot2::ggplot(data = df,  ggplot2::aes(x = x,  y = y)) + 
+    ggplot2::geom_tile(ggplot2::aes(fill = hex)) + 
     add.ops +
-    scale_x_continuous(expand = c(0, 0))+
-    scale_y_continuous(expand = c(0, 0))+
-    coord_fixed() +  
+    ggplot2::geom_text(ggplot2::aes(label = labels, 
+      colour = text_colour(as.character(names)))) +
+    ggplot2::scale_x_continuous(expand = c(0, 0))+
+    ggplot2::scale_y_continuous(expand = c(0, 0))+
+    ggplot2::coord_fixed() +  
     theme_munsell(back.col) +
-    scale_fill_identity()
+    ggplot2::scale_fill_identity() + 
+    ggplot2::scale_colour_identity() + 
+    ggplot2::theme(strip.background = ggplot2::element_blank(),
+      strip.text = ggplot2::element_blank())
 }
     
 
@@ -94,32 +112,36 @@ plot_mnsl <- function(cols,  back.col = "white", ...){
 #' hue_slice(c("5R", "5P"))
 #' \dontrun{hue_slice("all")}
 hue_slice <- function(hue.name = "all",  back.col = "white"){
-  require("ggplot2")
-
+  if (!requireNamespace("ggplot2", quietly = TRUE)) {
+    stop("ggplot2 needed for this function to work. Please install it.",
+      call. = FALSE)
+  }
   if (any(hue.name == "all")) {
-    return(ggplot(aes(x = factor(chroma), y = factor(value)), 
-      data = munsell.map) +
-       geom_tile(aes(fill = hex), colour = back.col) +
-      facet_wrap(~ hue) +
-      scale_x_discrete("Chroma", expand = c(0, 0)) + 
-      coord_fixed(ratio = 1) +
-      scale_y_discrete("Value", expand = c(0, 0)) +
+    return(
+      ggplot2::ggplot(ggplot2::aes(x = factor(chroma), y = factor(value)),
+        data = munsell.map) +
+      ggplot2::geom_tile(ggplot2::aes(fill = hex), colour = back.col) +
+      ggplot2::facet_wrap(~ hue) +
+      ggplot2::scale_x_discrete("Chroma", expand = c(0, 0)) + 
+      ggplot2::coord_fixed(ratio = 1) +
+      ggplot2::scale_y_discrete("Value", expand = c(0, 0)) +
       theme_munsell(back.col) +
-      scale_fill_identity())
+      ggplot2::scale_fill_identity()
+      )
   }
   else {
     if (!all(hue.name %in% munsell.map$hue)) stop("invalid hue names")
-  ggplot(aes(x = factor(chroma), y = factor(value)), 
-    data = subset(munsell.map, hue %in% hue.name)) +
-     geom_tile(aes(fill = hex), colour = back.col, size = 1) +
-     geom_text(aes(label = name, colour = text_colour(name)), 
-      angle = 45, size = 2) +
-     scale_colour_identity() +
-    scale_x_discrete("Chroma") + 
-    scale_y_discrete("Value", expand = c(0.125, 0)) +
-    theme_munsell(back.col) +
-    scale_fill_identity()+
-    facet_wrap(~ hue)
+    ggplot2::ggplot(ggplot2::aes(x = factor(chroma), y = factor(value)), 
+        data = subset(munsell.map, hue %in% hue.name)) +
+      ggplot2::geom_tile(ggplot2::aes(fill = hex), colour = back.col, size = 1) +
+      ggplot2::geom_text(ggplot2::aes(label = name, colour = text_colour(name)), 
+        angle = 45, size = 2) +
+      ggplot2::scale_colour_identity() +
+      ggplot2::scale_x_discrete("Chroma") + 
+      ggplot2::scale_y_discrete("Value", expand = c(0.125, 0)) +
+      theme_munsell(back.col) +
+      ggplot2::scale_fill_identity() +
+      ggplot2::facet_wrap(~ hue)
   }
 }
 
@@ -136,18 +158,20 @@ hue_slice <- function(hue.name = "all",  back.col = "white"){
 #' # all values 
 #' \dontrun{value_slice(1:10)}
 value_slice <- function(value.name = 1:10,  back.col = "white"){
-  require("ggplot2")
-
+  if (!requireNamespace("ggplot2", quietly = TRUE)) {
+    stop("ggplot2 needed for this function to work. Please install it.",
+      call. = FALSE)
+  }
   if (!all(value.name %in% munsell.map$value)) stop("invalid Value")
-  ggplot(aes(x = hue, y = factor(chroma)), 
-    data = subset(munsell.map, value %in% value.name & hue != "N" & !is.na(hex))) +
-     geom_tile(aes(fill = hex), colour = back.col) +
-     coord_polar() +
-    scale_x_discrete("Hue") + 
-    scale_y_discrete("Chroma") +
-    facet_wrap(~ value) +
+  ggplot2::ggplot(ggplot2::aes(x = hue, y = factor(chroma)), 
+      data = subset(munsell.map, value %in% value.name & hue != "N" & !is.na(hex))) +
+    ggplot2::geom_tile(ggplot2::aes(fill = hex), colour = back.col) +
+    ggplot2::coord_polar() +
+    ggplot2::scale_x_discrete("Hue") + 
+    ggplot2::scale_y_discrete("Chroma") +
+    ggplot2::facet_wrap(~ value) +
     theme_munsell(back.col) +
-    scale_fill_identity()
+    ggplot2::scale_fill_identity()
 }
 
 #' Plot all colours with the same chroma
@@ -163,26 +187,28 @@ value_slice <- function(value.name = 1:10,  back.col = "white"){
 #' # Maybe want to delete text and add axis instead
 #' p <- chroma_slice(18)
 #' p$layers[[2]] <- NULL # remove text layer
-#' p + theme(axis.text = element_text(), 
-#'           axis.text.x = element_text(angle = 90, hjust = 1))
+#' p + ggplot2::theme(axis.text = ggplot2::element_text(), 
+#'    axis.text.x = ggplot2::element_text(angle = 90, hjust = 1))
 #' # all values 
 #' \dontrun{chroma_slice(seq(0, 38, by = 2))}
 chroma_slice <- function(chroma.name = seq(0, 26, by = 2),  back.col = "white"){
-  require("ggplot2")
-
+  if (!requireNamespace("ggplot2", quietly = TRUE)) {
+    stop("ggplot2 needed for this function to work. Please install it.",
+      call. = FALSE)
+  }
   if (!all(chroma.name %in% munsell.map$chroma)) stop("invalid Chroma")
-  ggplot(aes(x = hue, y = value), 
-    data = subset(munsell.map, chroma %in% chroma.name & hue != "N")) +
-     geom_tile(aes(fill = hex), colour = back.col) +
-    geom_text(aes(label = name, colour = text_colour(name)), 
+  ggplot2::ggplot(ggplot2::aes(x = hue, y = value), 
+      data = subset(munsell.map, chroma %in% chroma.name & hue != "N")) +
+    ggplot2::geom_tile(ggplot2::aes(fill = hex), colour = back.col) +
+    ggplot2::geom_text(ggplot2::aes(label = name, colour = text_colour(name)), 
       angle = 45, size = 2) +
-     scale_colour_identity() +
-    scale_x_discrete("Hue") + 
-    scale_y_continuous("Value") +
-    coord_fixed(ratio = 1/4) +
-    facet_wrap(~ chroma) +
+    ggplot2::scale_colour_identity() +
+    ggplot2::scale_x_discrete("Hue") + 
+    ggplot2::scale_y_continuous("Value") +
+    ggplot2::coord_fixed(ratio = 1/4) +
+    ggplot2::facet_wrap(~ chroma) +
     theme_munsell(back.col) +
-    scale_fill_identity() 
+    ggplot2::scale_fill_identity() 
 }
 
 #' A vertical slice through the Munsell space
@@ -195,38 +221,74 @@ chroma_slice <- function(chroma.name = seq(0, 26, by = 2),  back.col = "white"){
 #' @examples
 #' complement_slice("5PB")
 #' complement_slice("5R")
+#' complement_slice("10G")
 complement_slice <- function(hue.name,  back.col = "white"){
-  require("ggplot2")
-
+  if (!requireNamespace("ggplot2", quietly = TRUE)) {
+    stop("ggplot2 needed for this function to work. Please install it.",
+      call. = FALSE)
+  }
+  
   if (length(hue.name) > 1) stop("complement_slice currently only takes one hue")
   if (!hue.name %in% munsell.map$hue) stop("invalid hue name")
-  hues <- levels(munsell.map$hue)[-1]
-  index <- which(hues == hue.name)
-  comp.hue <- hues[(index + 20) %% 40]
+  comp.hue <- mnsl2hvc(complement(hvc2mnsl(hue.name, 2, 2)))$hue 
   munsell.sub <- subset(munsell.map, 
      hue == hue.name | hue == comp.hue)
+  
   munsell.sub <- within(munsell.sub, {
     chroma <- ifelse(hue == comp.hue, -1, 1) * chroma
-    hue <- factor(hue, levels = c(comp.hue, "N", hues[index]))
+    hue <- factor(hue, levels = c(comp.hue, "N", hue.name))
     })
   
-  ggplot(aes(x = chroma, y = value), 
-    data = munsell.sub) + 
-     geom_tile(aes(fill = hex), colour = back.col,  size = 1) +
-    geom_text(aes(label = name, colour = text_colour(name)), 
+  ggplot2::ggplot(ggplot2::aes(x = chroma, y = value), 
+      data = munsell.sub) + 
+    ggplot2::geom_tile(ggplot2::aes(fill = hex), colour = back.col,  size = 1) +
+    ggplot2::geom_text(ggplot2::aes(label = name, colour = text_colour(name)), 
       angle = 45, size = 2) +
-    scale_fill_identity() +
-    scale_colour_identity() +
-    scale_x_continuous("Chroma") + 
-    scale_y_continuous("Value") +
-    facet_grid(. ~ hue,  scales = "free_x", space = "free")  +
-    coord_fixed() +
+    ggplot2::scale_fill_identity() +
+    ggplot2::scale_colour_identity() +
+    ggplot2::scale_x_continuous("Chroma") + 
+    ggplot2::scale_y_continuous("Value") +
+    ggplot2::facet_grid(. ~ hue,  scales = "free_x", space = "free")  +
+    ggplot2::coord_fixed() +
     theme_munsell(back.col)
   }
 
-#' Plot closest Munsell colour to an RGB colour
+# 
+# slice <- function(hue = NULL, chroma = NULL, value = NULL) {
+#   if (!requireNamespace("ggplot2", quietly = TRUE)) {
+#     stop("ggplot2 needed for this function to work. Please install it.",
+#       call. = FALSE)
+#   }
+#   spec <- as.list(match.call())[-1]
+#   cols <- merge(munsell:::munsell.map, expand.grid(spec))
+#   vars <- names(spec)
+#   varying <- c("hue", "chroma", "value")[!(c("hue", "chroma", "value") %in% vars)]
+#   if (length(vars) == 1){
+#     print(ggplot(cols, aes_string(varying[1], varying[2])) +
+#       geom_tile(aes(fill = hex),  size = 1) +
+#       geom_text(aes(label = name, colour = text_colour(name)), 
+#         angle = 45, size = 2) +
+#       scale_fill_identity() +
+#       scale_colour_identity() +
+#       coord_fixed() +
+#       theme_munsell())
+#   } else if (length(vars) == 2){
+#     print(ggplot(cols, aes_string(varying[1], 1)) +
+#       geom_tile(aes(fill = hex),  size = 1) +
+#       geom_text(aes(label = name, colour = text_colour(name)), 
+#         angle = 45, size = 2) +
+#       scale_fill_identity() +
+#       scale_colour_identity() +
+#       coord_fixed() +
+#       theme_munsell())
+#   }
+#   cols[order(cols$hue, cols$chroma, cols$value), "name"]
+# }
+
+
+#' Plot closest Munsell colour to an sRGB colour
 #'
-#' Take an RGB colour and plots it along with the closest Munsell colour (using \code{\link{rgb2mnsl}} to find it)
+#' Take an sRGB colour and plots it along with the closest Munsell colour (using \code{\link{rgb2mnsl}} to find it)
 #' @param R a numeric vector of red values or a 3 column matrix with the 
 #' proportions R,  G,  B in the columns.
 #' @param G numeric vector of green values
@@ -239,24 +301,27 @@ complement_slice <- function(hue.name,  back.col = "white"){
 #' plot_closest(0.1, 0.1, 0.3)
 #' plot_closest(matrix(c(.1, .2, .4, .5, .6, .8),  ncol = 3)) 
 plot_closest <- function(R, G = NULL, B = NULL,  back.col = "white"){
-  require("ggplot2")
-
+  if (!requireNamespace("ggplot2", quietly = TRUE)) {
+    stop("ggplot2 needed for this function to work. Please install it.",
+      call. = FALSE)
+  }
   closest <- rgb2mnsl(R, G, B)
   ncolours <- length(closest)
-  rgbnames <- apply(round(RGB(R, G, B)@coords, 2), 1, paste, collapse = ", ")
+  rgbnames <- apply(round(sRGB(R, G, B)@coords, 2), 1, paste, collapse = ", ")
   little.df <- data.frame(type = rep(c("actual", "closest"), each = ncolours),  
-    hex = c(hex(RGB(R,G,B)),  mnsl2hex(closest)), 
+    hex = c(hex(sRGB(R,G,B)),  mnsl2hex(closest)), 
     name = c(rgbnames, closest), 
     x = rep(c(0, 0), each = ncolours), y = rep(1:ncolours, 2), 
     text.colour = rep(text_colour(closest), 2))
-  ggplot(data = little.df, aes(x = x, y = y)) + geom_tile(aes(fill = hex),
-    colour = back.col, size = 2) +
-    geom_text(aes(label = name, colour = text.colour), size = 2) +
-    scale_colour_identity() +
-    coord_fixed(ratio = 1) +
+  ggplot2::ggplot(data = little.df, ggplot2::aes(x = x, y = y)) + 
+    ggplot2::geom_tile(ggplot2::aes(fill = hex),
+      colour = back.col, size = 2) +
+    ggplot2::geom_text(ggplot2::aes(label = name, colour = text.colour), size = 2) +
+    ggplot2::scale_colour_identity() +
+    ggplot2::coord_fixed(ratio = 1) +
     theme_munsell(back.col) +
-    scale_fill_identity()+
-    facet_wrap(~ type)
+    ggplot2::scale_fill_identity()+
+    ggplot2::facet_wrap(~ type)
 }
 
 #' Get text colour
@@ -267,9 +332,6 @@ plot_closest <- function(R, G = NULL, B = NULL,  back.col = "white"){
 #' @export
 #' @keywords internal
 text_colour <- function(cols){
-  col.split <- lapply(strsplit(cols, "/"), 
-     function(x) unlist(strsplit(x, " ")))
-  col.split <- lapply(col.split, gsub, pattern = "[A-Z]", replacement = "")
-  values <- as.numeric(sapply(col.split, "[", 2))
+  values <-  mnsl2hvc(cols)[, "value"]
   ifelse(values >4, "black", "white")
 }
\ No newline at end of file
diff --git a/R/sysdata.rda b/R/sysdata.rda
index 6d0ccde..4b1212d 100644
Binary files a/R/sysdata.rda and b/R/sysdata.rda differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7c35498
--- /dev/null
+++ b/README.md
@@ -0,0 +1,72 @@
+<!-- README.md is generated from README.Rmd. Please edit that file -->
+![Downloads](http://cranlogs.r-pkg.org/badges/last-week/munsell)
+
+munsell
+=======
+
+The `munsell` package provides easy access to, and manipulation of, the Munsell colours. The `munsell` package provides a mapping between Munsell's orginal notation (e.g. "5R 5/10") and hexidecimal sRGB strings suitable for use directly in R graphics. The package also provides utilities to explore slices through the Munsell colour tree, to transform Munsell colours and display colour palettes.
+
+Munsell devised his system of colour notation to match the three percetual dimensions of colour: hue, value and chroma. His notation provides a naming scheme to colours that eases the choice of color according to a specific purpose. His century old advice is still relevent for the producers of statistical graphics and the munsell package aims to enable user to easily follow it.
+
+Functions in `munsell` fall into three basic use categories: specifying Munsell colours, altering Munsell colours and exploring the Munsell color space.
+
+The code below relies on the development version of `munsell`, get it with:
+
+``` r
+devtools::install_github("cwickham/munsell")
+```
+
+Color specification
+-------------------
+
+Following Munsell, specifying colours is done with a specific string format: "H V/C" where H is a hue code (see `mnsl_hues()` for a list of those available, excluding "N"), V an integer in \([0, 10]\) specifying value, and C an even integer specifying chroma. The `mnsl` function takes the string and returns a hexadecimal RGB representation:
+
+``` r
+library(munsell)
+mnsl("5R 5/10")
+#> [1] "#C65858"
+```
+
+Visually examining a colour can either be done by using `mnsl` with a base plotting call, or using `plot_mnsl` which plots colour swatches using `ggplot2`:
+
+``` r
+plot.new()
+rect(0, 0, 1 ,1 , col = mnsl("5R 5/10"))
+plot_mnsl("5R 5/10")
+```
+
+Colour manipulation
+-------------------
+
+`munsell` provides convenience functions that alter a colour by taking steps in the hue, value and chroma dimensions: `rygbp`, `pbgyr`, `lighter`, `darker`, `saturate` and `desaturate`.
+
+``` r
+my_blue <- "5PB 5/8"
+p <- plot_mnsl(c(
+  lighter(my_blue, 2),      my_blue,   darker(my_blue, 2),
+  desaturate(my_blue, 2),   my_blue,   saturate(my_blue, 2),
+  rygbp(my_blue, 2),        my_blue,   pbgyr(my_blue, 2)))
+p
+```
+
+![](READMEimages/manipulate-blue-1.png)
+
+Each function optionally takes the number of steps to take in the dimension and consequently are easily used to create scales in a particular dimension.
+
+``` r
+p <- plot_mnsl(sapply(0:6, darker, col = "5PB 7/4"))
+p + ggplot2::facet_wrap(~ num, nrow = 1)
+```
+
+![](READMEimages/palette-1.png)
+
+Colour space exploration
+------------------------
+
+Slices through the colour space of constant hue, chroma or value can be displayed using the functions: `hue_slice`, `chroma_slice` and `value_slice`. Additionally `complement_slice` displays a slice of constant hue, alongside a slice of its complement, the hue that is on the opposite side of the colour sphere to that specified.
+
+``` r
+complement_slice("5R")
+```
+
+![](READMEimages/complement-slice-1.png)
diff --git a/inst/raw/getmunsellmap.R b/inst/raw/getmunsellmap.R
index beb21c7..10b0db5 100644
--- a/inst/raw/getmunsellmap.R
+++ b/inst/raw/getmunsellmap.R
@@ -9,7 +9,7 @@ getmunsellmap <- function(){
   # 3. convert XYZ (D65) to sRGB
 
   # 1. convert to XYZ
-  # http://www.brucelindbloom.com/index.html?ColorCalcHelp.html
+  # http://www.brucelindbloom.com/Eqn_xyY_to_XYZ.html
   # Y needs to be scaled down by 100
   col.map <- within(col.map, {
   	Y <- Y/100
@@ -18,13 +18,13 @@ getmunsellmap <- function(){
   })
 
   # 2. convert to XYZ to use correct reference white (C to D65)
-  # http://www.brucelindbloom.com/index.html?ColorCalcHelp.html
+  # http://www.brucelindbloom.com/Eqn_ChromAdapt.html
   # using Bradford method
   Bradford.C.D65 <- matrix(c(0.990448, -0.012371, -0.003564, -0.007168, 1.015594, 0.006770, -0.011615, -0.002928, 0.918157), ncol=3, byrow=TRUE)
   col.map[ , c("X", "Y", "Z")] <- as.matrix(col.map[, c("X", "Y", "Z")]) %*%
     Bradford.C.D65
   
-  # 3. Use colorspace methods to convert XYZ to hex (RGB)  
+  # 3. Use colorspace methods to convert XYZ to hex (sRGB)  
   col.map$hex <- hex(XYZ(100 * as.matrix(col.map[, c("X", "Y", "Z")])))
 
   cols <- c("R", "YR", "Y", "GY", "G", "BG", "B", "PB", "P", "RP")
@@ -34,7 +34,7 @@ getmunsellmap <- function(){
 
   # from here: http://wiki.laptop.org/go/Munsell
   grey.map <- read.table("greys.dat",  header = TRUE)
-  grey.map$hex <-  hex(RGB(as.matrix(1/255 * grey.map[, c("r", "b", "g")])))
+  grey.map$hex <-  hex(sRGB(as.matrix(1/255 * grey.map[, c("r", "b", "g")])))
 
   munsell.map <- rbind(grey.map[, c("h", "C", "V", "hex")], 
     col.map[, c("h", "C", "V", "hex")])
diff --git a/man/check_mnsl.Rd b/man/check_mnsl.Rd
index 0a99c38..f714599 100644
--- a/man/check_mnsl.Rd
+++ b/man/check_mnsl.Rd
@@ -1,25 +1,24 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/check.r
 \name{check_mnsl}
 \alias{check_mnsl}
 \title{Checks for valid Munsell colours}
 \usage{
-  check_mnsl(col, fix = FALSE)
+check_mnsl(col)
 }
 \arguments{
-  \item{col}{a character vector representing Munsell
-  colours.}
+\item{col}{a character vector representing Munsell colours.}
 
-  \item{fix}{passed on to \code{\link{fix_mnsl}}. Use
-  \code{fix = TRUE} to fix "bad" colours}
+\item{fix}{passed on to \code{\link{fix_mnsl}}. Use \code{fix = TRUE} to
+fix "bad" colours}
 }
 \value{
-  a character vector containing the input colours.  If any
-  colours were outside the gamut they will be represented
-  by NA.
+a character vector containing the input colours.  If any colours
+were outside the gamut they will be represented by NA.
 }
 \description{
-  Checks user supplied munsell specification for validity.
-  I.e. colour is of form "h v/c" and h, v and c take valid
-  values.
+Checks user supplied munsell specification for validity.  
+I.e. colour is of form "h v/c" and h,  v and c take valid values.
 }
 \examples{
 check_mnsl(c("5R 5/8","2.5R 9/28"))
diff --git a/man/chroma_slice.Rd b/man/chroma_slice.Rd
index f2c4bfa..5fb099d 100644
--- a/man/chroma_slice.Rd
+++ b/man/chroma_slice.Rd
@@ -1,21 +1,21 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{chroma_slice}
 \alias{chroma_slice}
 \title{Plot all colours with the same chroma}
 \usage{
-  chroma_slice(chroma.name = seq(0, 26, by = 2),
-    back.col = "white")
+chroma_slice(chroma.name = seq(0, 26, by = 2), back.col = "white")
 }
 \arguments{
-  \item{chroma.name}{integer vector of the desired values.}
+\item{chroma.name}{integer vector of the desired values.}
 
-  \item{back.col}{colour for the background}
+\item{back.col}{colour for the background}
 }
 \value{
-  ggplot object
+ggplot object
 }
 \description{
-  Plots slices of the Munsell colour system where chroma is
-  constant.
+Plots slices of the Munsell colour system where chroma is constant.
 }
 \examples{
 chroma_slice(2)
@@ -23,9 +23,9 @@ chroma_slice(18)
 # Maybe want to delete text and add axis instead
 p <- chroma_slice(18)
 p$layers[[2]] <- NULL # remove text layer
-p + theme(axis.text = element_text(),
-          axis.text.x = element_text(angle = 90, hjust = 1))
-# all values
+p + ggplot2::theme(axis.text = ggplot2::element_text(), 
+   axis.text.x = ggplot2::element_text(angle = 90, hjust = 1))
+# all values 
 \dontrun{chroma_slice(seq(0, 38, by = 2))}
 }
 
diff --git a/man/complement.Rd b/man/complement.Rd
index d616909..79869ab 100644
--- a/man/complement.Rd
+++ b/man/complement.Rd
@@ -1,21 +1,24 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
 \name{complement}
 \alias{complement}
 \title{Find the complement of a munsell colour}
 \usage{
-  complement(col, ...)
+complement(col, ...)
 }
 \arguments{
-  \item{col}{character vector of Munsell colours}
+\item{col}{character vector of Munsell colours}
 
-  \item{...}{passed on to \code{\link{in_gamut}}. Use
-  \code{fix = TRUE} to fix "bad" complement}
+\item{...}{passed on to \code{\link{in_gamut}}. Use \code{fix = TRUE} to
+fix "bad" complement}
 }
 \value{
-  character vector of Munsell colours
+character vector of Munsell colours
 }
 \description{
-  Finds the munsell colour with the same chroma and value
-  but on the opposite side of the hue circle.
+Finds the munsell colour with the same chroma and value but on the opposite
+side of the hue circle. The complement is not defined 
+for greys (hue == "N"), and the function returns the grey untransformed.
 }
 \examples{
 complement("5PB 2/4")
diff --git a/man/complement_slice.Rd b/man/complement_slice.Rd
index 2bcf739..24fd4b6 100644
--- a/man/complement_slice.Rd
+++ b/man/complement_slice.Rd
@@ -1,22 +1,25 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{complement_slice}
 \alias{complement_slice}
 \title{A vertical slice through the Munsell space}
 \usage{
-  complement_slice(hue.name, back.col = "white")
+complement_slice(hue.name, back.col = "white")
 }
 \arguments{
-  \item{hue.name}{character string of the desired hue.}
+\item{hue.name}{character string of the desired hue.}
 
-  \item{back.col}{colour for the background}
+\item{back.col}{colour for the background}
 }
 \value{
-  ggplot object
+ggplot object
 }
 \description{
-  Plot a hue and its complement at all values and chromas
+Plot a hue and its complement at all values and chromas
 }
 \examples{
 complement_slice("5PB")
 complement_slice("5R")
+complement_slice("10G")
 }
 
diff --git a/man/darker.Rd b/man/darker.Rd
index 2a5b3c0..075b163 100644
--- a/man/darker.Rd
+++ b/man/darker.Rd
@@ -1,21 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
 \name{darker}
 \alias{darker}
 \title{Make a munsell colour darker}
 \usage{
-  darker(col)
+darker(col, steps = 1)
 }
 \arguments{
-  \item{col}{character vector of Munsell colours}
+\item{col}{character vector of Munsell colours}
+
+\item{steps}{number of steps to take in decreasing value}
 }
 \value{
-  character vector of Munsell colours
+character vector of Munsell colours
 }
 \description{
-  Decreases the value of the Munsell colour by 1.
+Decreases the value of the Munsell colour by 1.
 }
 \examples{
-darker("5PB 2/4")
-cols <- c("5PB 2/4", "5Y 7/8")
-plot_mnsl(c(cols, darker(cols)))
+darker("5PB 3/4")
+cols <- c("5PB 3/4", "5Y 7/8")
+p <- plot_mnsl(c(cols, darker(cols), darker(cols, 2)))
+p + ggplot2::facet_wrap(~ names, ncol = 2)
 }
 
diff --git a/man/desaturate.Rd b/man/desaturate.Rd
index 46b2ec7..7a1afdc 100644
--- a/man/desaturate.Rd
+++ b/man/desaturate.Rd
@@ -1,22 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
 \name{desaturate}
 \alias{desaturate}
 \title{Make a munsell colour less saturated}
 \usage{
-  desaturate(col)
+desaturate(col, steps = 1)
 }
 \arguments{
-  \item{col}{character vector of Munsell colours}
+\item{col}{character vector of Munsell colours}
+
+\item{steps}{number of steps to take in decreasing chroma}
 }
 \value{
-  character vector of Munsell colours
+character vector of Munsell colours
 }
 \description{
-  Decreases the chroma of the Munsell colour by one step (-
-  2).
+Decreases the chroma of the Munsell colour by one step steps (multiples of 2).
 }
 \examples{
 desaturate("5PB 2/4")
-cols <- c("5PB 2/4", "5Y 7/8")
-plot_mnsl(c(cols, desaturate(cols)))
+cols <- c("5PB 2/6", "5Y 7/8")
+p <- plot_mnsl(c(cols, desaturate(cols), desaturate(cols, 2)))
+p + ggplot2::facet_wrap(~ names, ncol = 2)
 }
 
diff --git a/man/fix_mnsl.Rd b/man/fix_mnsl.Rd
index 63be284..55e1f14 100644
--- a/man/fix_mnsl.Rd
+++ b/man/fix_mnsl.Rd
@@ -1,22 +1,22 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/check.r
 \name{fix_mnsl}
 \alias{fix_mnsl}
 \title{Fix an undefined Munsell colour}
 \usage{
-  fix_mnsl(col)
+fix_mnsl(col)
 }
 \arguments{
-  \item{col}{a character vector representing Munsell
-  colours.}
+\item{col}{a character vector representing Munsell colours.}
 }
 \value{
-  a character vector containing the fixed colours.
+a character vector containing the fixed colours.
 }
 \description{
-  Takes correctly specified but undefined colours and
-  outputs something sensible.  Normally this happens when
-  the chroma is too high.  So, here sensible means the
-  colour with the same hue and value and maximum defined
-  chroma.
+Takes correctly specified but undefined colours and outputs something
+sensible.  Normally this happens when the chroma is too high.  So,  here
+sensible means the colour with the same hue and value and maximum defined
+chroma.
 }
 \examples{
 fix_mnsl(c("5R 5/8","2.5R 9/28"))
diff --git a/man/hue_slice.Rd b/man/hue_slice.Rd
index 74442a6..e98993a 100644
--- a/man/hue_slice.Rd
+++ b/man/hue_slice.Rd
@@ -1,21 +1,21 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{hue_slice}
 \alias{hue_slice}
 \title{Plot all colours with the same hue}
 \usage{
-  hue_slice(hue.name = "all", back.col = "white")
+hue_slice(hue.name = "all", back.col = "white")
 }
 \arguments{
-  \item{hue.name}{character vector of the desired hues. Or
-  "all" for all hues.}
+\item{hue.name}{character vector of the desired hues. Or "all" for all hues.}
 
-  \item{back.col}{colour for the background}
+\item{back.col}{colour for the background}
 }
 \value{
-  ggplot object
+ggplot object
 }
 \description{
-  Plots slices of the Munsell colour system where hue is
-  constant.
+Plots slices of the Munsell colour system where hue is constant.
 }
 \examples{
 hue_slice("5R")
diff --git a/man/hvc2mnsl.Rd b/man/hvc2mnsl.Rd
index 982d3c2..b8afcb6 100644
--- a/man/hvc2mnsl.Rd
+++ b/man/hvc2mnsl.Rd
@@ -1,43 +1,44 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/convert.r
 \name{hvc2mnsl}
 \alias{hvc2mnsl}
 \title{Converts a hue, chroma and value to a Munsell colour}
 \usage{
-  hvc2mnsl(hue, value, chroma, ...)
+hvc2mnsl(hue, value = NULL, chroma = NULL, ...)
 }
 \arguments{
-  \item{hue}{a character vector of Munsell hues}
+\item{hue}{a character vector of Munsell hues, or a 3 column data frame
+containing the hue value and chroma levels}
 
-  \item{value}{a numeric vector of values}
+\item{value}{a numeric vector of values}
 
-  \item{chroma}{a numeric vector of chromas}
+\item{chroma}{a numeric vector of chromas}
 
-  \item{...}{passed on to \code{\link{check_mnsl}}. Use
-  \code{fix = TRUE} to fix "bad" colours}
+\item{...}{passed on to \code{\link{check_mnsl}}. Use \code{fix = TRUE} to
+fix "bad" colours}
 }
 \value{
-  a character string specification of a hex colour
+a character string specification of a hex colour
 }
 \description{
-  Takes separate specifications of hue, value and chroma
-  and returns the text specification of that colour.
+Takes separate specifications of hue, value and chroma and returns the 
+text specification of that colour.
 }
 \details{
-  Munsell colours are specified by hue, value and chroma.
-  They take a form like "5PB 5/10" where the first
-  characters represent the hue, followed by a space then
-  the value and chroma separated by a "/". In this package
-  value should be an integer in 0:10 and chroma an even
-  number at most 24.  Note that not all possible
-  specifications result in representable colours.  Regular
-  recycling rules apply.
+Munsell colours are specified by hue, value and chroma.  They 
+take a form like "5PB 5/10" where the first characters represent the
+hue, followed by a space then the value and chroma separated by a "/". In
+this package value should be an integer in 0:10 and chroma an even number
+at most 24.  Note that not all possible specifications result in 
+representable colours.  Regular recycling rules apply.
 }
 \examples{
 hvc2mnsl("5PB", 5, 10)
 # All values of 5PB with chroma 10
 hvc2mnsl("5PB", 1:9, 10) # note some are undefined
-plot_mnsl(hvc2mnsl("5PB", 1:9, 2))
+plot_mnsl(hvc2mnsl("5PB", 1:9, 10))
 }
 \seealso{
-  \code{\link{check_mnsl}}, \code{\link{mnsl2hex}}
+\code{\link{check_mnsl}}, \code{\link{mnsl2hex}}
 }
 
diff --git a/man/in_gamut.Rd b/man/in_gamut.Rd
index 69e9b7b..8322512 100644
--- a/man/in_gamut.Rd
+++ b/man/in_gamut.Rd
@@ -1,25 +1,25 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/check.r
 \name{in_gamut}
 \alias{in_gamut}
 \title{Checks if a Munsell colour is defined in RGB space}
 \usage{
-  in_gamut(col, fix = FALSE)
+in_gamut(col, fix = FALSE)
 }
 \arguments{
-  \item{col}{a character vector representing Munsell
-  colours.}
+\item{col}{a character vector representing Munsell colours.}
 
-  \item{fix}{passed on to \code{\link{fix_mnsl}}. Use
-  \code{fix = TRUE} to fix "bad" colours}
+\item{fix}{passed on to \code{\link{fix_mnsl}}. Use \code{fix = TRUE} to
+fix "bad" colours}
 }
 \value{
-  a character vector containing the input colours.  If any
-  colours were outside the gamut they will be represented
-  by NA.
+a character vector containing the input colours.  If any colours
+were outside the gamut they will be represented by NA.
 }
 \description{
-  Not all possible correctly formatted Munsell colours
-  result in a colour representable in RGB space.  This
-  function checks if the colour is representable.
+Not all possible correctly formatted Munsell colours result in a colour
+representable in RGB space.  This function checks if the colour is
+representable.
 }
 \examples{
 in_gamut(c("5R 5/8","2.5R 9/28"))
diff --git a/man/lighter.Rd b/man/lighter.Rd
index fcaebf6..32e0d5f 100644
--- a/man/lighter.Rd
+++ b/man/lighter.Rd
@@ -1,21 +1,30 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
 \name{lighter}
 \alias{lighter}
 \title{Make a munsell colour lighter}
 \usage{
-  lighter(col)
+lighter(col, steps = 1)
 }
 \arguments{
-  \item{col}{character vector of Munsell colours}
+\item{col}{character vector of Munsell colours}
+
+\item{steps}{number of steps to take in increasing value}
 }
 \value{
-  character vector of Munsell colours
+character vector of Munsell colours
 }
 \description{
-  Increases the value of the Munsell colour by 1.
+Increases the value of the Munsell colour.
 }
 \examples{
 lighter("5PB 2/4")
-cols <- c("5PB 2/4", "5Y 7/8")
-plot_mnsl(c(cols, lighter(cols)))
+cols <- c("5PB 2/4", "5Y 6/8")
+p <- plot_mnsl(c(cols, lighter(cols), lighter(cols, 2)))
+p + ggplot2::facet_wrap(~ names, ncol = 2)
+# lighter and darker are usually reversible
+lighter(darker("5PB 2/4"))
+# unless you try to pass though white or black
+lighter(darker("5PB 1/4"))
 }
 
diff --git a/man/mnsl.Rd b/man/mnsl.Rd
index f36784d..1053d1c 100644
--- a/man/mnsl.Rd
+++ b/man/mnsl.Rd
@@ -1,41 +1,40 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/convert.r
 \name{mnsl}
 \alias{mnsl}
 \alias{mnsl2hex}
 \title{Converts a Munsell colour to hex}
 \usage{
-  mnsl(col, ...)
+mnsl(col, ...)
 }
 \arguments{
-  \item{col}{a character string representing a Munsell
-  colour.}
+\item{col}{a character string representing a Munsell colour.}
 
-  \item{...}{passed on to \code{\link{check_mnsl}}. Use
-  \code{fix = TRUE} to fix "bad" colours}
+\item{...}{passed on to \code{\link{check_mnsl}}. Use \code{fix = TRUE} to
+fix "bad" colours}
 }
 \value{
-  a character string specification of a hex colour
+a character string specification of a hex colour
 }
 \description{
-  Take a character string representation of a Munsell
-  colour and returns the hex specification of that colour
+Take a character string representation of a Munsell colour and returns the 
+hex specification of that colour
 }
 \details{
-  Munsell colours are specified by hue, value and chroma.
-  They take a form like "5PB 5/10" where the first
-  characters represent the hue, followed by a space then
-  the value and chroma separated by a "/". In this package
-  value should be an integer in 0:10 and chroma an even
-  number at most 24.  Note that not all possible
-  specifications result in representable colours.
+Munsell colours are specified by hue, value and chroma.  They 
+take a form like "5PB 5/10" where the first characters represent the
+hue, followed by a space then the value and chroma separated by a "/". In
+this package value should be an integer in 0:10 and chroma an even number
+at most 24.  Note that not all possible specifications result in 
+representable colours.
 }
 \examples{
 mnsl2hex("5PB 5/10")
 # use a munsell colour in a plot
-require("ggplot2")
-ggplot(data.frame(x = 1:10)) + geom_point(aes(x = x, y = x),
-  colour = mnsl2hex("5PB 5/10"))
+plot.new()
+rect(0, 0, 1 ,1 , col = mnsl("5R 5/10"))
 }
 \seealso{
-  \code{\link{check_mnsl}}, \code{\link{hvc2mnsl}}
+\code{\link{check_mnsl}}, \code{\link{hvc2mnsl}}
 }
 
diff --git a/man/mnsl2hvc.Rd b/man/mnsl2hvc.Rd
new file mode 100644
index 0000000..b31bf04
--- /dev/null
+++ b/man/mnsl2hvc.Rd
@@ -0,0 +1,38 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/convert.r
+\name{mnsl2hvc}
+\alias{mnsl2hvc}
+\title{Converts a Munsell colour to a hue, chroma and value triplet}
+\usage{
+mnsl2hvc(col, ...)
+}
+\arguments{
+\item{col}{a character vector of Munsell colours}
+
+\item{...}{passed on to \code{\link{check_mnsl}}. Use \code{fix = TRUE} to
+fix "bad" colours}
+}
+\value{
+a data frame with named columns hue, value and chroma containing the hue,
+value and chroma levels.
+}
+\description{
+Takes a text specification of a Munsell colour and returns
+the hue, chroma and value triplet.
+}
+\details{
+Munsell colours are specified by hue, value and chroma.  They 
+take a form like "5PB 5/10" where the first characters represent the
+hue, followed by a space then the value and chroma separated by a "/". In
+this package value should be an integer in 0:10 and chroma an even number
+at most 24.  Note that not all possible specifications result in 
+representable colours.
+}
+\examples{
+mnsl2hvc("5PB 5/10")
+hvc2mnsl(mnsl2hvc("5PB 5/10"))
+}
+\seealso{
+\code{\link{check_mnsl}}, \code{\link{hvc2mnsl}}
+}
+
diff --git a/man/mnsl_hues.Rd b/man/mnsl_hues.Rd
index fd289f3..9aceb60 100644
--- a/man/mnsl_hues.Rd
+++ b/man/mnsl_hues.Rd
@@ -1,15 +1,16 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/check.r
 \name{mnsl_hues}
 \alias{mnsl_hues}
 \title{Munsell hues}
 \usage{
-  mnsl_hues()
+mnsl_hues()
 }
 \value{
-  a character vector containing the fixed colours.
+a character vector containing the hue values.
 }
 \description{
-  Returns a character vector of the Munsell hues in hue
-  order starting at 2.5R and excluding grey ("N").
+Returns a character vector of the Munsell hues in hue order starting at 2.5R and excluding grey ("N").
 }
 \examples{
 mnsl_hues()
diff --git a/man/munsell.Rd b/man/munsell.Rd
index c55705f..7f4e4b8 100644
--- a/man/munsell.Rd
+++ b/man/munsell.Rd
@@ -1,3 +1,5 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/munsell.r
 \docType{package}
 \name{munsell}
 \alias{munsell}
@@ -5,7 +7,12 @@
 \alias{package-munsell}
 \title{Munsell colour system.}
 \description{
-  This package makes it easy to access and manipulate the
-  colours in the munsell colour system.
+This package makes it easy to access and manipulate the colours in the 
+munsell colour system. The conversion from munsell specifications to sRGB based on the renotation data from  \url{http://www.cis.rit.edu/mcsl/online/munsell.php} which is a digitization of Table 1 in Newhall, Nickerson & Judd (1943).  The code for conversion can be found in the package directory in inst/raw/getmunsellmap.r
+}
+\references{
+S. M. Newhall, D. Nickerson, and D. B. Judd. Final report of the O.S.A. subcommittee on the spacing of the munsell colors. J. Opt. Soc. Am., 33(7):385-411, 07 1943.
+
+Munsell Renotation Data, RIT Munsell Color Science Laboratory.  \url{http://www.cis.rit.edu/mcsl/online/munsell.php}
 }
 
diff --git a/man/pbgyr.Rd b/man/pbgyr.Rd
new file mode 100644
index 0000000..a8da706
--- /dev/null
+++ b/man/pbgyr.Rd
@@ -0,0 +1,25 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
+\name{pbgyr}
+\alias{pbgyr}
+\title{Change the hue of a munsell colour}
+\usage{
+pbgyr(col, steps = 1)
+}
+\arguments{
+\item{col}{character vector of Munsell colours}
+
+\item{steps}{number of hue steps to take}
+}
+\value{
+character vector of Munsell colours
+}
+\description{
+Moves the hue of a munsell colour in the direction purple->blue->green->yellow->red->purple
+}
+\examples{
+my_red <- "2.5R 4/8"
+pbgyr(my_red)
+plot_mnsl(c(my_red, pbgyr(my_red, 2), pbgyr(my_red, 4)))
+}
+
diff --git a/man/plot_closest.Rd b/man/plot_closest.Rd
index 2e85a02..9e0d9b4 100644
--- a/man/plot_closest.Rd
+++ b/man/plot_closest.Rd
@@ -1,31 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{plot_closest}
 \alias{plot_closest}
-\title{Plot closest Munsell colour to an RGB colour}
+\title{Plot closest Munsell colour to an sRGB colour}
 \usage{
-  plot_closest(R, G = NULL, B = NULL, back.col = "white")
+plot_closest(R, G = NULL, B = NULL, back.col = "white")
 }
 \arguments{
-  \item{R}{a numeric vector of red values or a 3 column
-  matrix with the proportions R, G, B in the columns.}
+\item{R}{a numeric vector of red values or a 3 column matrix with the 
+proportions R,  G,  B in the columns.}
 
-  \item{G}{numeric vector of green values}
+\item{G}{numeric vector of green values}
 
-  \item{B}{numeric vector of blue values}
+\item{B}{numeric vector of blue values}
 
-  \item{back.col}{colour for the background}
+\item{back.col}{colour for the background}
 }
 \value{
-  ggplot object
+ggplot object
 }
 \description{
-  Take an RGB colour and plots it along with the closest
-  Munsell colour (using \code{\link{rgb2mnsl}} to find it)
+Take an sRGB colour and plots it along with the closest Munsell colour (using \code{\link{rgb2mnsl}} to find it)
 }
 \examples{
 plot_closest(0.1, 0.1, 0.3)
-plot_closest(matrix(c(.1, .2, .4, .5, .6, .8),  ncol = 3))
+plot_closest(matrix(c(.1, .2, .4, .5, .6, .8),  ncol = 3)) 
 }
 \seealso{
-  \code{\link{rgb2mnsl}}
+\code{\link{rgb2mnsl}}
 }
 
diff --git a/man/plot_hex.Rd b/man/plot_hex.Rd
index 65f0209..2894cf7 100644
--- a/man/plot_hex.Rd
+++ b/man/plot_hex.Rd
@@ -1,21 +1,21 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{plot_hex}
 \alias{plot_hex}
 \title{Plot hex colours}
 \usage{
-  plot_hex(hex.colour, back.col = "white")
+plot_hex(hex.colour, back.col = "white")
 }
 \arguments{
-  \item{hex.colour}{character vector specifying colours in
-  hex form}
+\item{hex.colour}{character vector specifying colours in hex form}
 
-  \item{back.col}{specification of background colour of
-  display}
+\item{back.col}{specification of background colour of display}
 }
 \value{
-  A ggplot object
+A ggplot object
 }
 \description{
-  Quick way to look at a set of hex colours.
+Quick way to look at a set of hex colours.
 }
 \examples{
 plot_hex("#000000")
diff --git a/man/plot_mnsl.Rd b/man/plot_mnsl.Rd
index 66448f2..43c6386 100644
--- a/man/plot_mnsl.Rd
+++ b/man/plot_mnsl.Rd
@@ -1,25 +1,23 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{plot_mnsl}
 \alias{plot_mnsl}
 \title{Plot a munsell colour}
 \usage{
-  plot_mnsl(cols, back.col = "white", ...)
+plot_mnsl(cols, back.col = "white", ...)
 }
 \arguments{
-  \item{cols}{character vector specifying colours in
-  Munsell form}
+\item{cols}{character vector specifying colours in Munsell form}
 
-  \item{back.col}{specification of background colour of
-  display}
+\item{back.col}{specification of background colour of display}
 
-  \item{...}{passed to \code{\link{check_mnsl}}. Add fix =
-  TRUE to fix "bad" colours()}
+\item{...}{passed to \code{\link{check_mnsl}}. Add fix = TRUE to fix "bad" colours()}
 }
 \value{
-  A ggplot object
+A ggplot object
 }
 \description{
-  Takes munsell text specifications and plots colour
-  squares of them.
+Takes munsell text specifications and plots colour squares of them.
 }
 \examples{
 plot_mnsl("5R 5/6")
@@ -29,6 +27,6 @@ p <- plot_mnsl(c("5R 6/6", "5Y 6/6", "5G 6/6", "5B 6/6", "5P 6/6"),
 p
 # returned object is a ggplot object so we can alter the layout
 summary(p)
-p + facet_wrap(~ names, nrow = 1)
+p + ggplot2::facet_wrap(~ num, nrow = 1)
 }
 
diff --git a/man/rgb2mnsl.Rd b/man/rgb2mnsl.Rd
index 51c9c5f..20549ab 100644
--- a/man/rgb2mnsl.Rd
+++ b/man/rgb2mnsl.Rd
@@ -1,20 +1,21 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/convert.r
 \name{rgb2mnsl}
 \alias{rgb2mnsl}
-\title{Converts an RGB colour to Munsell}
+\title{Converts an sRGB colour to Munsell}
 \usage{
-  rgb2mnsl(R, G = NULL, B = NULL)
+rgb2mnsl(R, G = NULL, B = NULL)
 }
 \arguments{
-  \item{R}{a numeric vector of red values or a 3 column
-  matrix with the proportions R, G, B in the columns.}
+\item{R}{a numeric vector of red values or a 3 column matrix with the
+proportions R,  G,  B in the columns.}
 
-  \item{G}{numeric vector of green values}
+\item{G}{numeric vector of green values}
 
-  \item{B}{numeric vector of blue values}
+\item{B}{numeric vector of blue values}
 }
 \description{
-  Finds the closest Munsell colour (in LUV space) to the
-  specified RGB colour
+Finds the closest Munsell colour (in LUV space) to the specified sRGB colour
 }
 \examples{
 rgb2mnsl(0.1, 0.1, 0.3)
@@ -22,6 +23,6 @@ rgb2mnsl(matrix(c(.1, .2, .4, .5, .6, .8),  ncol = 3))
 plot_closest(matrix(c(.1, .2, .4, .5, .6, .8),  ncol = 3))
 }
 \seealso{
-  \code{\link{plot_closest}}
+\code{\link{plot_closest}}
 }
 
diff --git a/man/rygbp.Rd b/man/rygbp.Rd
new file mode 100644
index 0000000..9c59d75
--- /dev/null
+++ b/man/rygbp.Rd
@@ -0,0 +1,25 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
+\name{rygbp}
+\alias{rygbp}
+\title{Change the hue of a munsell colour}
+\usage{
+rygbp(col, steps = 1)
+}
+\arguments{
+\item{col}{character vector of Munsell colours}
+
+\item{steps}{number of hue steps to take}
+}
+\value{
+character vector of Munsell colours
+}
+\description{
+Moves the hue of a munsell colour in the direction red->yellow->green->blue->purple->red
+}
+\examples{
+my_red <- "10R 4/8"
+rygbp(my_red)
+plot_mnsl(c(my_red, rygbp(my_red, 2), rygbp(my_red, 4)))
+}
+
diff --git a/man/saturate.Rd b/man/saturate.Rd
index 7d484b8..b0f3f7b 100644
--- a/man/saturate.Rd
+++ b/man/saturate.Rd
@@ -1,22 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
 \name{saturate}
 \alias{saturate}
 \title{Make a munsell colour more saturated}
 \usage{
-  saturate(col)
+saturate(col, steps = 1)
 }
 \arguments{
-  \item{col}{character vector of Munsell colours}
+\item{col}{character vector of Munsell colours}
+
+\item{steps}{number of steps to take in increasing chroma}
 }
 \value{
-  character vector of Munsell colours
+character vector of Munsell colours
 }
 \description{
-  Increases the chroma of the Munsell colour by one step (+
-  2).
+Increases the chroma of the Munsell colour by step steps (multiples of 2).
 }
 \examples{
 saturate("5PB 2/4")
-cols <- c("5PB 2/4", "5Y 7/8")
-plot_mnsl(c(cols, saturate(cols)))
+cols <- c("5PB 2/2", "5Y 7/6")
+p <- plot_mnsl(c(cols, saturate(cols), saturate(cols, 2)))
+p + ggplot2::facet_wrap(~ names, ncol = 2)
 }
 
diff --git a/man/seq_mnsl.Rd b/man/seq_mnsl.Rd
index d83f4bd..cfb4956 100644
--- a/man/seq_mnsl.Rd
+++ b/man/seq_mnsl.Rd
@@ -1,27 +1,32 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/alter.r
 \name{seq_mnsl}
 \alias{seq_mnsl}
 \title{Generate a sequence of Munsell colours}
 \usage{
-  seq_mnsl(from, to, n)
+seq_mnsl(from, to, n, fix = FALSE)
 }
 \arguments{
-  \item{from}{character string of first Munsell colour}
+\item{from}{character string of first Munsell colour}
 
-  \item{to}{character string of last Munsell colour}
+\item{to}{character string of last Munsell colour}
 
-  \item{n}{number of colours in sequence}
+\item{n}{number of colours in sequence}
+
+\item{fix}{Should colours outside of the gamut be fixed? 
+Passed on to \code{\link{fix_mnsl}}}
 }
 \value{
-  character vector of Munsell colours
+character vector of Munsell colours
 }
 \description{
-  Generates a sequence of Munsell colours.  The sequence is
-  generated by finding the closest munsell colours to a
-  equidistant sequence of colours in #' LUV space.
+Generates a sequence of Munsell colours.  The sequence is generated by 
+finding the closest munsell colours to a equidistant sequence of colours in  #' LUV space.
 }
 \examples{
 seq_mnsl("5R 2/4", "5R 5/16", 4)
 plot_mnsl(seq_mnsl("5R 2/4", "5R 5/16", 4))
-plot_mnsl(seq_mnsl("5R 2/4", complement("5R 2/4", fix = TRUE), 5))
+plot_mnsl(seq_mnsl("5R 5/6", 
+  complement("5R 5/6"), 5))
 }
 
diff --git a/man/text_colour.Rd b/man/text_colour.Rd
index 715bbdd..a0ce549 100644
--- a/man/text_colour.Rd
+++ b/man/text_colour.Rd
@@ -1,18 +1,19 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{text_colour}
 \alias{text_colour}
 \title{Get text colour}
 \usage{
-  text_colour(cols)
+text_colour(cols)
 }
 \arguments{
-  \item{a}{character vector of munsell colours}
+\item{a}{character vector of munsell colours}
 }
 \value{
-  a vector of "black" or "white"
+a vector of "black" or "white"
 }
 \description{
-  Get the appropriate text colour for writing on a munsell
-  colour.
+Get the appropriate text colour for writing on a munsell colour.
 }
 \keyword{internal}
 
diff --git a/man/theme_munsell.Rd b/man/theme_munsell.Rd
index 0759fe1..792f01d 100644
--- a/man/theme_munsell.Rd
+++ b/man/theme_munsell.Rd
@@ -1,14 +1,16 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{theme_munsell}
 \alias{theme_munsell}
 \title{Default munsell plot theme}
 \usage{
-  theme_munsell(bg.col)
+theme_munsell(bg.col = "white")
 }
 \arguments{
-  \item{bg.col}{takes colour to use as background colour}
+\item{bg.col}{takes colour to use as background colour}
 }
 \description{
-  Removes unnecessary clutter in plots
+Removes unnecessary clutter in plots
 }
 \keyword{internal}
 
diff --git a/man/value_slice.Rd b/man/value_slice.Rd
index 5e2b11d..35b2b32 100644
--- a/man/value_slice.Rd
+++ b/man/value_slice.Rd
@@ -1,25 +1,26 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.r
 \name{value_slice}
 \alias{value_slice}
 \title{Plot all colours with the same value}
 \usage{
-  value_slice(value.name = 1:10, back.col = "white")
+value_slice(value.name = 1:10, back.col = "white")
 }
 \arguments{
-  \item{value.name}{integer vector of the desired values.}
+\item{value.name}{integer vector of the desired values.}
 
-  \item{back.col}{colour for the background}
+\item{back.col}{colour for the background}
 }
 \value{
-  ggplot object
+ggplot object
 }
 \description{
-  Plots slices of the Munsell colour system where value is
-  constant.
+Plots slices of the Munsell colour system where value is constant.
 }
 \examples{
 value_slice(2)
 value_slice(c(2, 4))
-# all values
+# all values 
 \dontrun{value_slice(1:10)}
 }
 
diff --git a/tests/testthat.R b/tests/testthat.R
new file mode 100644
index 0000000..7245f4c
--- /dev/null
+++ b/tests/testthat.R
@@ -0,0 +1,3 @@
+library(testthat)
+library(munsell)
+test_check("munsell")
\ No newline at end of file
diff --git a/tests/testthat/test-alter.R b/tests/testthat/test-alter.R
new file mode 100644
index 0000000..d6f98cf
--- /dev/null
+++ b/tests/testthat/test-alter.R
@@ -0,0 +1,78 @@
+
+context("Lightening/darkening colours")
+
+test_that("Lightening a light colour gives white", {
+  expect_equal(lighter("5PB 9/4"), "N 10/0")
+  expect_equal(lighter("N 9/0"), "N 10/0")
+  expect_equal(lighter("N 10/0 "), "N 10/0")
+  expect_equal(lighter(c("N 9/0 ", "N 10/0 ")), c("N 10/0", "N 10/0"))
+})
+  
+test_that("Darkening a dark colour gives black", {
+  expect_equal(darker("N 0/0"), "N 0/0")
+  expect_equal(darker("5PB 1/4"), "N 0/0")
+})
+
+test_that("Negative darkening lightens", {
+  expect_equal(lighter("5PB 2/4", -1), darker("5PB 2/4", 1))
+})
+
+context("Saturate/desaturate colours")
+
+test_that("Saturation edge cases", {
+  expect_equal(desaturate("5PB 2/2"), "N 2/0")
+  expect_equal(saturate("5PB 2/32"), "5PB 2/34")
+})
+
+test_that("Saturation/desaturate opposites", {
+  expect_equal(desaturate("5PB 2/4"), saturate("5PB 2/4", -1))
+  expect_equal(desaturate(saturate("5PB 2/10")), "5PB 2/10")
+})
+
+context("Complement colours")
+
+test_that("Complement",{
+  expect_equal(complement("2.5R 2/2"), "2.5BG 2/2")
+  expect_equal(complement("10G 2/2"), "10RP 2/2")
+  expect_warning(complement("N 10/0"), "grey")
+})
+
+context("Hues")
+
+test_that("hue edges",{
+  expect_equal(pbgyr("2.5R 2/2"), "10RP 2/2")
+  expect_equal(rygbp("10RP 2/2"), "2.5R 2/2")
+  expect_warning(rygbp("N 10/0"), "[Gg]rey")
+})
+
+context("Handling NAs")
+test_that(" NA handler", {
+expect_equivalent(na_handle(na.exclude(NA), numeric(0)), as.numeric(NA))
+# vector vector
+expect_equal(na_handle(na.exclude(c(NA, 1:2)), 3:4), c(NA, 3, 4))
+# vector dataframe
+expect_equivalent(na_handle(na.exclude(c(NA, 1:2)), data.frame(x = 1:2, y = 4:5)),
+  data.frame(x = c(NA, 1:2), y = c(NA, 4:5)))
+# dataframe vector
+expect_equivalent(na_handle(na.exclude(data.frame(x = c(NA, 1:2), y = c(NA, 4:5))), 1:2),
+  c(NA, 1:2))
+# dataframe dataframe 
+expect_equivalent(na_handle(na.exclude(data.frame(x = c(NA, 1:2), y = c(NA, 4:5))), 
+    data.frame(x = 1:2, y = 4:5)),
+  data.frame(x = c(NA, 1:2), y = c(NA, 4:5)))
+})
+
+test_that("single NA", {
+  expect_error(lighter(NA), "zero")
+  expect_error(saturate(NA),"zero")
+  expect_error(rygbp(NA), "zero")
+  expect_error(complement(NA), "zero")
+})
+
+test_that("NA with colour", {
+  expect_equal(lighter(c(NA, "10RP 2/2")), c(NA, lighter("10RP 2/2")))
+  expect_equal(saturate(c(NA, "10RP 2/2")), c(NA, saturate("10RP 2/2")))
+  expect_equal(rygbp(c(NA, "10RP 2/2")), c(NA, rygbp("10RP 2/2")))
+  expect_equal(complement(c(NA, "10RP 2/2")), c(NA, complement("10RP 2/2")))
+})
+
diff --git a/tests/testthat/test-convert.R b/tests/testthat/test-convert.R
new file mode 100644
index 0000000..50abc37
--- /dev/null
+++ b/tests/testthat/test-convert.R
@@ -0,0 +1,12 @@
+context("Testing missing value conversion")
+
+test_that("NAs handled in convert", {  
+  expect_error(mnsl2hvc(c(NA)), "zero")
+  expect_equal(hvc2mnsl(mnsl2hvc(c(NA, "10RP 2/2"))), c(NA, "10RP 2/2"))
+})
+
+test_that("NAs handled in checks", {
+  expect_equal(check_mnsl(NA), as.character(NA))
+  expect_equal(in_gamut(NA), as.logical(NA)) #wtf
+  expect_equal(check_mnsl(c(NA, "10RP 2/2")), c(NA, "10RP 2/2"))
+})

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/r-cran-munsell.git



More information about the debian-med-commit mailing list