prettyunits/0000755000176200001440000000000012550616764012700 5ustar liggesusersprettyunits/inst/0000755000176200001440000000000012550616174013650 5ustar liggesusersprettyunits/inst/README.Rmd0000644000176200001440000000564212516242571015256 0ustar liggesusers ```{r, setup, echo = FALSE, message = FALSE} knitr::opts_chunk$set( comment = "##>", tidy = FALSE, error = FALSE) ``` [![Linux Build Status](https://travis-ci.org/gaborcsardi/prettyunits.svg?branch=master)](https://travis-ci.org/gaborcsardi/prettyunits) [![Windows Build status](https://ci.appveyor.com/api/projects/status/github/gaborcsardi/prettyunits?svg=true)](https://ci.appveyor.com/project/gaborcsardi/prettyunits) [![CRAN RStudio mirror downloads](http://cranlogs.r-pkg.org/badges/prettyunits)](http://cran.r-project.org/web/packages/prettyunits/index.html) # prettyunits The `prettyunits` package formats quantities in human readable form. Currently time units and information (i.e. bytes) are supported. ## Installation You can install the package from github: ```{r eval = FALSE} library(devtools) install_github("gaborcsardi/prettyunits") ``` ```{r} library(prettyunits) library(magrittr) ``` ## Bytes `pretty_bytes` formats number of bytes in a human readable way: ```{r} pretty_bytes(1337) pretty_bytes(133337) pretty_bytes(13333337) pretty_bytes(1333333337) pretty_bytes(133333333337) ``` Here is a simple function that emulates the Unix `ls` command, with nicely formatted file sizes: ```{r} uls <- function(path = ".") { files <- dir(path) info <- files %>% lapply(file.info) %>% do.call(what = rbind) info$size <- pretty_bytes(info$size) df <- data.frame(d = ifelse(info$isdir, "d", " "), mode = as.character(info$mode), user = info$uname, group = info$grname, size = ifelse(info$isdir, "", info$size), modified = info$mtime, name = files) print(df, row.names = FALSE) } uls() ``` ## Time intervals `pretty_ms` formats a time interval given in milliseconds. `pretty_sec` does the same for seconds, and `pretty_dt` for `difftime` objects. The optional `compact` argument turns on a compact, approximate format. ```{r} pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000)) pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000), compact = TRUE) pretty_sec(c(1337, 13370, 133700, 1337000, 13370000)) pretty_sec(c(1337, 13370, 133700, 1337000, 13370000), compact = TRUE) ``` ## Vague time intervals `vague_dt` and `time_ago` formats time intervals using a vague format, omitting smaller units. They both have three formats: `default`, `short` and `terse`. `vague_dt` takes a `difftime` object, and `time_ago` works relatively to the specified date. ```{r} vague_dt(format = "short", as.difftime(30, units = "secs")) vague_dt(format = "short", as.difftime(14, units = "mins")) vague_dt(format = "short", as.difftime(5, units = "hours")) vague_dt(format = "short", as.difftime(25, units = "hours")) vague_dt(format = "short", as.difftime(5, units = "days")) ``` ```{r} now <- Sys.time() time_ago(now) time_ago(now - as.difftime(30, units = "secs")) time_ago(now - as.difftime(14, units = "mins")) time_ago(now - as.difftime(5, units = "hours")) time_ago(now - as.difftime(25, units = "hours")) ``` ```{r} ``` prettyunits/inst/NEWS.md0000644000176200001440000000017112550616174014745 0ustar liggesusers # 1.0.2 First version with a NEWS file. * Get rid of `R CMD check` notes. # 1.0.0 Last version without a NEWS file. prettyunits/inst/README.md0000644000176200001440000001104612516242573015131 0ustar liggesusers [![Linux Build Status](https://travis-ci.org/gaborcsardi/prettyunits.svg?branch=master)](https://travis-ci.org/gaborcsardi/prettyunits) [![Windows Build status](https://ci.appveyor.com/api/projects/status/github/gaborcsardi/prettyunits?svg=true)](https://ci.appveyor.com/project/gaborcsardi/prettyunits) [![CRAN RStudio mirror downloads](http://cranlogs.r-pkg.org/badges/prettyunits)](http://cran.r-project.org/web/packages/prettyunits/index.html) # prettyunits The `prettyunits` package formats quantities in human readable form. Currently time units and information (i.e. bytes) are supported. ## Installation You can install the package from github: ```r library(devtools) install_github("gaborcsardi/prettyunits") ``` ```r library(prettyunits) library(magrittr) ``` ## Bytes `pretty_bytes` formats number of bytes in a human readable way: ```r pretty_bytes(1337) ``` ``` ##> [1] "1.34 kB" ``` ```r pretty_bytes(133337) ``` ``` ##> [1] "133.34 kB" ``` ```r pretty_bytes(13333337) ``` ``` ##> [1] "13.33 MB" ``` ```r pretty_bytes(1333333337) ``` ``` ##> [1] "1.33 GB" ``` ```r pretty_bytes(133333333337) ``` ``` ##> [1] "133.33 GB" ``` Here is a simple function that emulates the Unix `ls` command, with nicely formatted file sizes: ```r uls <- function(path = ".") { files <- dir(path) info <- files %>% lapply(file.info) %>% do.call(what = rbind) info$size <- pretty_bytes(info$size) df <- data.frame(d = ifelse(info$isdir, "d", " "), mode = as.character(info$mode), user = info$uname, group = info$grname, size = ifelse(info$isdir, "", info$size), modified = info$mtime, name = files) print(df, row.names = FALSE) } uls() ``` ``` ##> d mode user group size modified name ##> 644 gaborcsardi staff 795.00 B 2014-10-13 09:00:43 appveyor.yml ##> 644 gaborcsardi staff 561.00 B 2014-10-13 09:19:59 DESCRIPTION ##> 644 gaborcsardi staff 42.00 B 2014-10-03 15:44:54 LICENSE ##> 644 gaborcsardi staff 111.00 B 2014-10-12 23:07:32 Makefile ##> d 755 gaborcsardi staff 2014-10-12 16:51:06 man ##> 644 gaborcsardi staff 259.00 B 2014-10-12 16:51:39 NAMESPACE ##> d 755 gaborcsardi staff 2014-10-12 16:47:25 R ##> 644 gaborcsardi staff 4.46 kB 2014-10-13 09:04:42 README.md ##> 644 gaborcsardi staff 2.98 kB 2015-04-23 15:18:17 README.Rmd ##> 644 gaborcsardi staff 4.01 kB 2015-03-14 14:42:48 tags ##> d 755 gaborcsardi staff 2014-10-12 15:15:48 tests ``` ## Time intervals `pretty_ms` formats a time interval given in milliseconds. `pretty_sec` does the same for seconds, and `pretty_dt` for `difftime` objects. The optional `compact` argument turns on a compact, approximate format. ```r pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000)) ``` ``` ##> [1] "1.3s" "13.4s" "2m 13.7s" "22m 17s" ##> [5] "15d 11h 23m 20s" ``` ```r pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000), compact = TRUE) ``` ``` ##> [1] "~1.3s" "~13.4s" "~2m" "~22m" "~15d" ``` ```r pretty_sec(c(1337, 13370, 133700, 1337000, 13370000)) ``` ``` ##> [1] "22m 17s" "3h 42m 50s" "1d 13h 8m 20s" ##> [4] "15d 11h 23m 20s" "154d 17h 53m 20s" ``` ```r pretty_sec(c(1337, 13370, 133700, 1337000, 13370000), compact = TRUE) ``` ``` ##> [1] "~22m" "~3h" "~1d" "~15d" "~154d" ``` ## Vague time intervals `vague_dt` and `time_ago` formats time intervals using a vague format, omitting smaller units. They both have three formats: `default`, `short` and `terse`. `vague_dt` takes a `difftime` object, and `time_ago` works relatively to the specified date. ```r vague_dt(format = "short", as.difftime(30, units = "secs")) ``` ``` ##> [1] "<1 min" ``` ```r vague_dt(format = "short", as.difftime(14, units = "mins")) ``` ``` ##> [1] "14 min" ``` ```r vague_dt(format = "short", as.difftime(5, units = "hours")) ``` ``` ##> [1] "5 hours" ``` ```r vague_dt(format = "short", as.difftime(25, units = "hours")) ``` ``` ##> [1] "1 day" ``` ```r vague_dt(format = "short", as.difftime(5, units = "days")) ``` ``` ##> [1] "5 day" ``` ```r now <- Sys.time() time_ago(now) ``` ``` ##> [1] "moments ago" ``` ```r time_ago(now - as.difftime(30, units = "secs")) ``` ``` ##> [1] "less than a minute ago" ``` ```r time_ago(now - as.difftime(14, units = "mins")) ``` ``` ##> [1] "14 minutes ago" ``` ```r time_ago(now - as.difftime(5, units = "hours")) ``` ``` ##> [1] "5 hours ago" ``` ```r time_ago(now - as.difftime(25, units = "hours")) ``` ``` ##> [1] "a day ago" ``` prettyunits/tests/0000755000176200001440000000000012416551544014035 5ustar liggesusersprettyunits/tests/testthat.R0000644000176200001440000000010212416551544016011 0ustar liggesuserslibrary(testthat) library(prettyunits) test_check("prettyunits") prettyunits/tests/testthat/0000755000176200001440000000000012550616764015702 5ustar liggesusersprettyunits/tests/testthat/test-ms.r0000644000176200001440000001012312416640637017453 0ustar liggesusers context("Pretty milliseconds") test_that("pretty_ms works", { expect_equal(pretty_ms(0), '0ms') expect_equal(pretty_ms(0.1), '1ms') expect_equal(pretty_ms(1), '1ms') expect_equal(pretty_ms(1000 + 400), '1.4s') expect_equal(pretty_ms(1000 * 2 + 400), '2.4s') expect_equal(pretty_ms(1000 * 55), '55s') expect_equal(pretty_ms(1000 * 67), '1m 7s') expect_equal(pretty_ms(1000 * 60 * 5), '5m') expect_equal(pretty_ms(1000 * 60 * 67), '1h 7m') expect_equal(pretty_ms(1000 * 60 * 60 * 12), '12h') expect_equal(pretty_ms(1000 * 60 * 60 * 40), '1d 16h') expect_equal(pretty_ms(1000 * 60 * 60 * 999), '41d 15h') }) test_that("compact pretty_ms works", { expect_equal(pretty_ms(1000 + 4, compact = TRUE), '~1s') expect_equal(pretty_ms(1000 * 60 * 60 * 999, compact = TRUE), '~41d') }) test_that("pretty_ms handles vectors", { v <- c(0, 0.1, 1, 1400, 2400, 1000 * 55, 1000 * 67, 1000 * 60 * 5, 1000 * 60 * 67, 1000 * 60 * 60 * 12, 1000 * 60 * 60 * 40, 1000 * 60 * 60 * 999) v2 <- c("0ms", "1ms", "1ms", "1.4s", "2.4s", "55s", "1m 7s", "5m", "1h 7m", "12h", "1d 16h", "41d 15h") expect_equal(pretty_ms(v), v2) }) context("Pretty seconds") test_that("pretty_sec works", { expect_equal(pretty_sec(0 / 1000), '0ms') expect_equal(pretty_sec(0.1 / 1000), '1ms') expect_equal(pretty_sec(1 / 1000), '1ms') expect_equal(pretty_sec((1000 + 400) / 1000), '1.4s') expect_equal(pretty_sec((1000 * 2 + 400) / 1000), '2.4s') expect_equal(pretty_sec(1000 * 55 / 1000), '55s') expect_equal(pretty_sec(1000 * 67 / 1000), '1m 7s') expect_equal(pretty_sec(1000 * 60 * 5 / 1000), '5m') expect_equal(pretty_sec(1000 * 60 * 67 / 1000), '1h 7m') expect_equal(pretty_sec(1000 * 60 * 60 * 12 / 1000), '12h') expect_equal(pretty_sec(1000 * 60 * 60 * 40 / 1000), '1d 16h') expect_equal(pretty_sec(1000 * 60 * 60 * 999 / 1000), '41d 15h') }) test_that("compact pretty_sec works", { expect_equal(pretty_sec((1000 + 4) / 1000, compact = TRUE), '~1s') expect_equal(pretty_sec(1000 * 60 * 60 * 999 / 1000, compact = TRUE), '~41d') }) test_that("pretty_sec handles vectors", { v <- c(0, 0.1, 1, 1400, 2400, 1000 * 55, 1000 * 67, 1000 * 60 * 5, 1000 * 60 * 67, 1000 * 60 * 60 * 12, 1000 * 60 * 60 * 40, 1000 * 60 * 60 * 999) / 1000 v2 <- c("0ms", "1ms", "1ms", "1.4s", "2.4s", "55s", "1m 7s", "5m", "1h 7m", "12h", "1d 16h", "41d 15h") expect_equal(pretty_sec(v), v2) }) context("Pretty dt") test_that("pretty_dt works", { expect_equal(pretty_dt(as.difftime(units = "secs", 0 / 1000)), '0ms') expect_equal(pretty_dt(as.difftime(units = "secs", 0.1 / 1000)), '1ms') expect_equal(pretty_dt(as.difftime(units = "secs", 1 / 1000)), '1ms') expect_equal(pretty_dt(as.difftime(units = "secs", (1000 + 400) / 1000)), '1.4s') expect_equal(pretty_dt(as.difftime(units = "secs", (1000 * 2 + 400) / 1000)), '2.4s') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 55 / 1000)), '55s') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 67 / 1000)), '1m 7s') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 60 * 5 / 1000)), '5m') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 60 * 67 / 1000)), '1h 7m') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 60 * 60 * 12 / 1000)), '12h') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 60 * 60 * 40 / 1000)), '1d 16h') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 60 * 60 * 999 / 1000)), '41d 15h') }) test_that("compact pretty_dt works", { expect_equal(pretty_dt(as.difftime(units = "secs", (1000 + 4) / 1000), compact = TRUE), '~1s') expect_equal(pretty_dt(as.difftime(units = "secs", 1000 * 60 * 60 * 999 / 1000), compact = TRUE), '~41d') }) test_that("pretty_dt handles vectors", { v <- c(0, 0.1, 1, 1400, 2400, 1000 * 55, 1000 * 67, 1000 * 60 * 5, 1000 * 60 * 67, 1000 * 60 * 60 * 12, 1000 * 60 * 60 * 40, 1000 * 60 * 60 * 999) / 1000 v2 <- c("0ms", "1ms", "1ms", "1.4s", "2.4s", "55s", "1m 7s", "5m", "1h 7m", "12h", "1d 16h", "41d 15h") expect_equal(pretty_dt(as.difftime(units = "secs", v)), v2) }) prettyunits/tests/testthat/test-bytes.r0000644000176200001440000000267712416565002020171 0ustar liggesusers context("Pretty bytes") test_that("pretty_bytes gives errors on invalid input", { expect_error(pretty_bytes(''), 'is.numeric.*is not TRUE') expect_error(pretty_bytes('1'), 'is.numeric.*is not TRUE') expect_error(pretty_bytes(TRUE), 'is.numeric.*is not TRUE') expect_error(pretty_bytes(list(1,2,3)), 'is.numeric.*is not TRUE') }) test_that("pretty_bytes converts properly", { expect_equal(pretty_bytes(0), '0 B') expect_equal(pretty_bytes(10), '10 B') expect_equal(pretty_bytes(999), '999 B') expect_equal(pretty_bytes(1001), '1 kB') expect_equal(pretty_bytes(1e16), '10 PB') expect_equal(pretty_bytes(1e30), '1000000 YB') }) test_that("pretty_bytes handles NA and NaN", { expect_equal(pretty_bytes(NA_real_), "NA B") expect_equal(pretty_bytes(NA_integer_), "NA B") expect_error(pretty_bytes(NA_character_), 'is.numeric.*is not TRUE') expect_error(pretty_bytes(NA), 'is.numeric.*is not TRUE') expect_equal(pretty_bytes(NaN), "NaN B") }) test_that("pretty_bytes handles vectors", { expect_equal(pretty_bytes(1:10), paste(format(1:10), "B")) v <- c(NA, 1, 1e4, 1e6, NaN, 1e5) expect_equal(pretty_bytes(v), c(" NA B", " 1 B", " 10 kB", " 1 MB", "NaN B", "100 kB")) expect_equal(pretty_bytes(numeric()), character()) }) test_that("pretty_bytes handles negative values", { v <- c(NA, -1, 1e4, 1e6, NaN, -1e5) expect_equal(pretty_bytes(v), c(" NA B", " -1 B", " 10 kB", " 1 MB", " NaN B", "-100 kB")) }) prettyunits/tests/testthat/test-vague-dt.r0000644000176200001440000000366512416637564020572 0ustar liggesusers context("Vague time intervals") ## Amount, unit, default result, short, terse all_tests <- list( list( 1, "secs", "moments ago", "<1 min", " 1s"), list( 30, "secs", "less than a minute ago", "<1 min", "30s"), list( 50, "secs", "about a minute ago", "1 min", " 1m"), list( 14, "mins", "14 minutes ago", "14 min", "14m"), list( 70, "mins", "about an hour ago", "1 hour", " 1h"), list( 5, "hours", "5 hours ago", "5 hours", " 5h"), list( 25, "hours", "a day ago", "1 day", " 1d"), list( 5, "days", "5 days ago", "5 day", " 5d"), list( 30, "days", "about a month ago", "1 mon", " 1M"), list( 30 * 3, "days", "3 months ago", "3 mon", " 3M"), list(365, "days", "about a year ago", "1 year", " 1y"), list(365 * 10, "days", "10 years ago", "10 years", "10y") ) test_that("vague_dt works", { sapply(all_tests, function(case) { dt <- as.difftime(case[[1]], units = case[[2]]) default <- vague_dt(dt) short <- vague_dt(dt, format = "short") terse <- vague_dt(dt, format = "terse") expect_equal(default, case[[3]], info = paste(case[[1]], case[[2]], "default")) expect_equal(short, case[[4]], info = paste(case[[1]], case[[2]], "short")) expect_equal(terse, case[[5]], info = paste(case[[1]], case[[2]], "terse")) }) }) test_that("time_ago works", { sapply(all_tests, function(case) { t <- Sys.time() - as.difftime(case[[1]], units = case[[2]]) default <- time_ago(t) short <- time_ago(t, format = "short") terse <- time_ago(t, format = "terse") expect_equal(default, case[[3]], info = paste(case[[1]], case[[2]], "default")) expect_equal(short, case[[4]], info = paste(case[[1]], case[[2]], "short")) expect_equal(terse, case[[5]], info = paste(case[[1]], case[[2]], "terse")) }) }) prettyunits/NAMESPACE0000644000176200001440000000043212550567624014116 0ustar liggesusers# Generated by roxygen2 (4.1.1): do not edit by hand export(pretty_bytes) export(pretty_dt) export(pretty_ms) export(pretty_sec) export(time_ago) export(vague_dt) importFrom(assertthat,assert_that) importFrom(assertthat,is.string) importFrom(magrittr,"%>%") importFrom(methods,is) prettyunits/R/0000755000176200001440000000000012550567573013104 5ustar liggesusersprettyunits/R/time-ago.r0000644000176200001440000001475112501100357014754 0ustar liggesusers e <- expression vague_dt_default <- list( list(c = e(seconds < 10), s = "moments ago"), list(c = e(seconds < 45), s = "less than a minute ago"), list(c = e(seconds < 90), s = "about a minute ago"), list(c = e(minutes < 45), s = e("%d minutes ago" %s% round(minutes))), list(c = e(minutes < 90), s = "about an hour ago"), list(c = e(hours < 24), s = e("%d hours ago" %s% round(hours))), list(c = e(hours < 42), s = "a day ago"), list(c = e(days < 30), s = e("%d days ago" %s% round(days))), list(c = e(days < 45), s = "about a month ago"), list(c = e(days < 335), s = e("%d months ago" %s% round(days / 30))), list(c = e(years < 1.5), s = "about a year ago"), list(c = TRUE, s = e("%d years ago" %s% round(years))) ) vague_dt_short <- list( list(c = e(seconds < 50), s = "<1 min"), list(c = e(minutes < 50), s = e("%d min" %s% round(minutes))), list(c = e(hours < 1.5), s = "1 hour"), list(c = e(hours < 18), s = e("%d hours" %s% round(hours))), list(c = e(hours < 42), s = "1 day"), list(c = e(days < 30), s = e("%d day" %s% round(days))), list(c = e(days < 45), s = "1 mon"), list(c = e(days < 335), s = e("%d mon" %s% round(days / 30))), list(c = e(years < 1.5), s = "1 year"), list(c = TRUE, s = e("%d years" %s% round(years))) ) vague_dt_terse <- list( list(c = e(seconds < 50), s = e("%2ds" %s% round(seconds))), list(c = e(minutes < 50), s = e("%2dm" %s% round(minutes))), list(c = e(hours < 18), s = e("%2dh" %s% round(hours))), list(c = e(days < 30), s = e("%2dd" %s% round(days))), list(c = e(days < 335), s = e("%2dM" %s% round(days / 30))), list(c = TRUE, s = e("%2dy" %s% round(years))) ) vague_dt_formats <- list( "default" = vague_dt_default, "short" = vague_dt_short, "terse" = vague_dt_terse ) #' Human readable format of the time interval since a time point #' #' It calls \code{\link{vague_dt}} to do the actual formatting. #' #' @param date Date(s), \code{as.POSIXct} will be called on them. #' @param format Format, currently available formats are: #' \sQuote{default}, \sQuote{short}, \sQuote{terse}. See examples below. #' @return Character vector of the formatted time intervals. #' #' @export #' @examples #' now <- Sys.time() #' #' time_ago(now) #' time_ago(now - as.difftime(30, units = "secs")) #' time_ago(now - as.difftime(14, units = "mins")) #' time_ago(now - as.difftime(5, units = "hours")) #' time_ago(now - as.difftime(25, units = "hours")) #' time_ago(now - as.difftime(5, units = "days")) #' time_ago(now - as.difftime(30, units = "days")) #' time_ago(now - as.difftime(365, units = "days")) #' time_ago(now - as.difftime(365 * 10, units = "days")) #' #' ## Short format #' time_ago(format = "short", now) #' time_ago(format = "short", now - as.difftime(30, units = "secs")) #' time_ago(format = "short", now - as.difftime(14, units = "mins")) #' time_ago(format = "short", now - as.difftime(5, units = "hours")) #' time_ago(format = "short", now - as.difftime(25, units = "hours")) #' time_ago(format = "short", now - as.difftime(5, units = "days")) #' time_ago(format = "short", now - as.difftime(30, units = "days")) #' time_ago(format = "short", now - as.difftime(365, units = "days")) #' time_ago(format = "short", now - as.difftime(365 * 10, units = "days")) #' #' ## Even shorter, terse format, (almost always) exactly 3 characters wide #' time_ago(format = "terse", now) #' time_ago(format = "terse", now - as.difftime(30, units = "secs")) #' time_ago(format = "terse", now - as.difftime(14, units = "mins")) #' time_ago(format = "terse", now - as.difftime(5, units = "hours")) #' time_ago(format = "terse", now - as.difftime(25, units = "hours")) #' time_ago(format = "terse", now - as.difftime(5, units = "days")) #' time_ago(format = "terse", now - as.difftime(30, units = "days")) #' time_ago(format = "terse", now - as.difftime(365, units = "days")) #' time_ago(format = "terse", now - as.difftime(365 * 10, units = "days")) time_ago <- function(date, format = c("default", "short", "terse")) { date <- as.POSIXct(date) if (length(date) > 1) return(sapply(date, time_ago, format = format)) seconds <- Sys.time() %>% difftime(date, units = "secs") vague_dt(seconds, format = format) } #' Human readable format of a time interval #' #' @param dt A \code{difftime} object, the time interval(s). #' @param format Format, currently available formats are: #' \sQuote{default}, \sQuote{short}, \sQuote{terse}. See examples below. #' @return Character vector of the formatted time intervals. #' #' @export #' @examples #' vague_dt(as.difftime(30, units = "secs")) #' vague_dt(as.difftime(14, units = "mins")) #' vague_dt(as.difftime(5, units = "hours")) #' vague_dt(as.difftime(25, units = "hours")) #' vague_dt(as.difftime(5, units = "days")) #' vague_dt(as.difftime(30, units = "days")) #' vague_dt(as.difftime(365, units = "days")) #' vague_dt(as.difftime(365 * 10, units = "days")) #' #' ## Short format #' vague_dt(format = "short", as.difftime(30, units = "secs")) #' vague_dt(format = "short", as.difftime(14, units = "mins")) #' vague_dt(format = "short", as.difftime(5, units = "hours")) #' vague_dt(format = "short", as.difftime(25, units = "hours")) #' vague_dt(format = "short", as.difftime(5, units = "days")) #' vague_dt(format = "short", as.difftime(30, units = "days")) #' vague_dt(format = "short", as.difftime(365, units = "days")) #' vague_dt(format = "short", as.difftime(365 * 10, units = "days")) #' #' ## Even shorter, terse format, (almost always) exactly 3 characters wide #' vague_dt(format = "terse", as.difftime(30, units = "secs")) #' vague_dt(format = "terse", as.difftime(14, units = "mins")) #' vague_dt(format = "terse", as.difftime(5, units = "hours")) #' vague_dt(format = "terse", as.difftime(25, units = "hours")) #' vague_dt(format = "terse", as.difftime(5, units = "days")) #' vague_dt(format = "terse", as.difftime(30, units = "days")) #' vague_dt(format = "terse", as.difftime(365, units = "days")) #' vague_dt(format = "terse", as.difftime(365 * 10, units = "days")) vague_dt <- function(dt, format = c("default", "short", "terse")) { assert_diff_time(dt) units(dt) <- "secs" seconds <- as.vector(dt) ## Simplest to quit here for empty input if (!length(seconds)) return(character()) pieces <- list( minutes = seconds / 60, hours = seconds / 60 / 60, days = seconds / 60 / 60 / 24, years = seconds / 60 / 60 / 24 / 365.25 ) format <- match.arg(format) for (p in vague_dt_formats[[format]]) { if (eval(p$c, pieces)) return(eval(p$s, pieces)) } } prettyunits/R/sizes.r0000644000176200001440000000166512416643156014425 0ustar liggesusers #' Bytes in a human readable string #' #' @param bytes Numeric vector, number of bytes. #' @return Character vector, the formatted sizes. #' #' @export #' @examples #' pretty_bytes(1337) #' pretty_bytes(133337) #' pretty_bytes(13333337) #' pretty_bytes(1333333337) #' pretty_bytes(133333333337) pretty_bytes <- function(bytes) { stopifnot(is.numeric(bytes)) units <- c('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB') neg <- bytes < 0 & !is.na(bytes) bytes <- abs(bytes) exponent <- pmin(floor(log(bytes, 1000)), length(units) - 1) res <- round(bytes / 1000 ^ exponent, 2) unit <- units[exponent + 1] ## Zero bytes res[bytes == 0] <- 0 unit[bytes == 0] <- units[1] ## NA and NaN bytes res[is.na(bytes)] <- NA_real_ res[is.nan(bytes)] <- NaN unit[is.na(bytes)] <- "B" # Includes NaN as well ## String res <- format(ifelse(neg, -1, 1) * res, scientific = FALSE) "%s %s" %s% list(res, unit) } prettyunits/R/time.r0000644000176200001440000000503612550567573014231 0ustar liggesusers parse_ms <- function(ms) { stopifnot(is.numeric(ms)) data.frame( days = floor(ms / 86400000), hours = floor((ms / 3600000) %% 24), minutes = floor((ms / 60000) %% 60), seconds = round((ms / 1000) %% 60, 1) ) } first_positive <- function(x) which(x > 0)[1] trim <- function (x) gsub("^\\s+|\\s+$", "", x) #' Pretty formatting of milliseconds #' #' @param ms Numeric vector of milliseconds #' @param compact If true, then only the first non-zero #' unit is used. See examples below. #' @return Character vector of formatted time intervals. #' #' @family time #' @export #' @examples #' pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000)) #' #' pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000), #' compact = TRUE) pretty_ms <- function(ms, compact = FALSE) { stopifnot(is.numeric(ms)) parsed <- parse_ms(ms) %>% t() if (compact) { units <- c("d", "h", "m", "s") parsed2 <- parsed parsed2[] <- paste0(parsed, units) idx <- apply(parsed, 2, first_positive) %>% cbind(seq_len(length(ms))) parsed2[idx] %>% paste0("~", .) } else { ## Exact for small ones exact <- paste0(ceiling(ms), "ms") ## Approximate for others, in seconds merge_pieces <- function(pieces) { ( (if (pieces[1]) pieces[1] %+% "d " else "") %+% (if (pieces[2]) pieces[2] %+% "h " else "") %+% (if (pieces[3]) pieces[3] %+% "m " else "") %+% (if (pieces[4]) pieces[4] %+% "s " else "") ) } approx <- trim(apply(parsed, 2, merge_pieces)) ifelse(ms < 1000, exact, approx) } } #' Pretty formatting of seconds #' #' @param sec Numeric vector of seconds. #' @return Character vector of formatted time intervals. #' #' @inheritParams pretty_ms #' @family time #' @export #' @examples #' pretty_sec(c(1337, 13370, 133700, 1337000, 13370000)) #' #' pretty_sec(c(1337, 13370, 133700, 1337000, 13370000), #' compact = TRUE) pretty_sec <- function(sec, compact = FALSE) { pretty_ms(sec * 1000, compact = compact) } #' Pretty formatting of time intervals (difftime objects) #' #' @param dt A \code{difftime} object, a vector of time #' differences. #' @return Character vector of formatted time intervals. #' #' @inheritParams pretty_ms #' @family time #' @export #' @importFrom methods is #' @examples #' pretty_dt(as.difftime(1000, units = "secs")) #' pretty_dt(as.difftime(0, units = "secs")) pretty_dt <- function(dt, compact = FALSE) { stopifnot(is(dt, "difftime")) units(dt) <- "secs" as.vector(dt) %>% pretty_sec(compact = compact) } prettyunits/R/utils.r0000644000176200001440000000046212416604152014413 0ustar liggesusers #' @importFrom assertthat assert_that is.string `%s%` <- function(lhs, rhs) { assert_that(is.string(lhs)) list(lhs) %>% c(as.list(rhs)) %>% do.call(what = sprintf) } `%+%` <- function(lhs, rhs) { paste0(lhs, rhs) } assert_diff_time <- function(x) { stopifnot(inherits(x, "difftime")) } prettyunits/R/pretty-package.r0000644000176200001440000000020012413577331016166 0ustar liggesusers #' Prettier formatting of quantities #' #' @docType package #' @name prettyunits #' @importFrom magrittr %>% NULL . <- "STFU" prettyunits/MD50000644000176200001440000000212312550616764013206 0ustar liggesusersa38a241a307ccea87b37d73ee5a638d1 *DESCRIPTION 3d55ef9a10c04c95a867277c02d32bca *LICENSE a721a0a6adc44cbe1ea3e164bb1fed5c *NAMESPACE a4bc058206feaddf8edcd3d2dc21ccfd *R/pretty-package.r 98451cf71d340e5d5ede32637c0bcecd *R/sizes.r c68dedcc1c36d9de65d8f9b43c57e010 *R/time-ago.r e67460d79bcf4c37ca1c185b4051bbf0 *R/time.r 58e328fd294f4ade5025fb393bd1ca56 *R/utils.r 60bc0664f12e7e4a8c6ee49618db5672 *inst/NEWS.md 48619686b38568ba65f28c288304aab9 *inst/README.Rmd c157c0891b7911a7865b61b8ce18df83 *inst/README.md 7ce684cd37b50f2584569b0986629e21 *man/pretty_bytes.Rd 4d8ce90ab48c9780255edb907745df62 *man/pretty_dt.Rd f73d3b114199084105f6cc16774218b8 *man/pretty_ms.Rd 4fca9fc697f5ddb99f7ad0b3b4cb06b3 *man/pretty_sec.Rd c2fe310a01a0e92bcd4c9fbb05764fb9 *man/prettyunits.Rd 8b48a38660d5171d5ffb3433893c3bd2 *man/time_ago.Rd 3e98c1ddb8e7480ff2c4e9008eb64924 *man/vague_dt.Rd d4df5b35b4ce6e070b4980c38847cad3 *tests/testthat.R e59a4dc5477c4387d8cb97eb914c9b8c *tests/testthat/test-bytes.r 472ebe383f5377d40c6687d64374d49c *tests/testthat/test-ms.r 50c54d52ed56e60a64709770a7d38412 *tests/testthat/test-vague-dt.r prettyunits/DESCRIPTION0000644000176200001440000000126212550616764014407 0ustar liggesusersPackage: prettyunits Title: Pretty, Human Readable Formatting of Quantities Version: 1.0.2 Author: Gabor Csardi Maintainer: Gabor Csardi Description: Pretty, human readable formatting of quantities. Time intervals: 1337000 -> 15d 11h 23m 20s. Vague time intervals: 2674000 -> about a month ago. Bytes: 1337 -> 1.34 kB. License: MIT + file LICENSE LazyData: true URL: https://github.com/gaborcsardi/prettyunits BugReports: https://github.com/gaborcsardi/prettyunits/issues Imports: magrittr, assertthat, methods Suggests: testthat NeedsCompilation: no Packaged: 2015-07-13 02:03:57 UTC; gaborcsardi Repository: CRAN Date/Publication: 2015-07-13 04:09:56 prettyunits/man/0000755000176200001440000000000012416564672013454 5ustar liggesusersprettyunits/man/vague_dt.Rd0000644000176200001440000000367612550567624015554 0ustar liggesusers% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/time-ago.r \name{vague_dt} \alias{vague_dt} \title{Human readable format of a time interval} \usage{ vague_dt(dt, format = c("default", "short", "terse")) } \arguments{ \item{dt}{A \code{difftime} object, the time interval(s).} \item{format}{Format, currently available formats are: \sQuote{default}, \sQuote{short}, \sQuote{terse}. See examples below.} } \value{ Character vector of the formatted time intervals. } \description{ Human readable format of a time interval } \examples{ vague_dt(as.difftime(30, units = "secs")) vague_dt(as.difftime(14, units = "mins")) vague_dt(as.difftime(5, units = "hours")) vague_dt(as.difftime(25, units = "hours")) vague_dt(as.difftime(5, units = "days")) vague_dt(as.difftime(30, units = "days")) vague_dt(as.difftime(365, units = "days")) vague_dt(as.difftime(365 * 10, units = "days")) ## Short format vague_dt(format = "short", as.difftime(30, units = "secs")) vague_dt(format = "short", as.difftime(14, units = "mins")) vague_dt(format = "short", as.difftime(5, units = "hours")) vague_dt(format = "short", as.difftime(25, units = "hours")) vague_dt(format = "short", as.difftime(5, units = "days")) vague_dt(format = "short", as.difftime(30, units = "days")) vague_dt(format = "short", as.difftime(365, units = "days")) vague_dt(format = "short", as.difftime(365 * 10, units = "days")) ## Even shorter, terse format, (almost always) exactly 3 characters wide vague_dt(format = "terse", as.difftime(30, units = "secs")) vague_dt(format = "terse", as.difftime(14, units = "mins")) vague_dt(format = "terse", as.difftime(5, units = "hours")) vague_dt(format = "terse", as.difftime(25, units = "hours")) vague_dt(format = "terse", as.difftime(5, units = "days")) vague_dt(format = "terse", as.difftime(30, units = "days")) vague_dt(format = "terse", as.difftime(365, units = "days")) vague_dt(format = "terse", as.difftime(365 * 10, units = "days")) } prettyunits/man/pretty_sec.Rd0000644000176200001440000000124612550567624016126 0ustar liggesusers% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/time.r \name{pretty_sec} \alias{pretty_sec} \title{Pretty formatting of seconds} \usage{ pretty_sec(sec, compact = FALSE) } \arguments{ \item{sec}{Numeric vector of seconds.} \item{compact}{If true, then only the first non-zero unit is used. See examples below.} } \value{ Character vector of formatted time intervals. } \description{ Pretty formatting of seconds } \examples{ pretty_sec(c(1337, 13370, 133700, 1337000, 13370000)) pretty_sec(c(1337, 13370, 133700, 1337000, 13370000), compact = TRUE) } \seealso{ Other time: \code{\link{pretty_dt}}; \code{\link{pretty_ms}} } prettyunits/man/prettyunits.Rd0000644000176200001440000000043112550567624016352 0ustar liggesusers% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/pretty-package.r \docType{package} \name{prettyunits} \alias{prettyunits} \alias{prettyunits-package} \title{Prettier formatting of quantities} \description{ Prettier formatting of quantities } prettyunits/man/pretty_dt.Rd0000644000176200001440000000130212550567624015754 0ustar liggesusers% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/time.r \name{pretty_dt} \alias{pretty_dt} \title{Pretty formatting of time intervals (difftime objects)} \usage{ pretty_dt(dt, compact = FALSE) } \arguments{ \item{dt}{A \code{difftime} object, a vector of time differences.} \item{compact}{If true, then only the first non-zero unit is used. See examples below.} } \value{ Character vector of formatted time intervals. } \description{ Pretty formatting of time intervals (difftime objects) } \examples{ pretty_dt(as.difftime(1000, units = "secs")) pretty_dt(as.difftime(0, units = "secs")) } \seealso{ Other time: \code{\link{pretty_ms}}; \code{\link{pretty_sec}} } prettyunits/man/pretty_bytes.Rd0000644000176200001440000000075612550567624016507 0ustar liggesusers% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/sizes.r \name{pretty_bytes} \alias{pretty_bytes} \title{Bytes in a human readable string} \usage{ pretty_bytes(bytes) } \arguments{ \item{bytes}{Numeric vector, number of bytes.} } \value{ Character vector, the formatted sizes. } \description{ Bytes in a human readable string } \examples{ pretty_bytes(1337) pretty_bytes(133337) pretty_bytes(13333337) pretty_bytes(1333333337) pretty_bytes(133333333337) } prettyunits/man/pretty_ms.Rd0000644000176200001440000000126112550567624015770 0ustar liggesusers% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/time.r \name{pretty_ms} \alias{pretty_ms} \title{Pretty formatting of milliseconds} \usage{ pretty_ms(ms, compact = FALSE) } \arguments{ \item{ms}{Numeric vector of milliseconds} \item{compact}{If true, then only the first non-zero unit is used. See examples below.} } \value{ Character vector of formatted time intervals. } \description{ Pretty formatting of milliseconds } \examples{ pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000)) pretty_ms(c(1337, 13370, 133700, 1337000, 1337000000), compact = TRUE) } \seealso{ Other time: \code{\link{pretty_dt}}; \code{\link{pretty_sec}} } prettyunits/man/time_ago.Rd0000644000176200001440000000433712550567624015535 0ustar liggesusers% Generated by roxygen2 (4.1.1): do not edit by hand % Please edit documentation in R/time-ago.r \name{time_ago} \alias{time_ago} \title{Human readable format of the time interval since a time point} \usage{ time_ago(date, format = c("default", "short", "terse")) } \arguments{ \item{date}{Date(s), \code{as.POSIXct} will be called on them.} \item{format}{Format, currently available formats are: \sQuote{default}, \sQuote{short}, \sQuote{terse}. See examples below.} } \value{ Character vector of the formatted time intervals. } \description{ It calls \code{\link{vague_dt}} to do the actual formatting. } \examples{ now <- Sys.time() time_ago(now) time_ago(now - as.difftime(30, units = "secs")) time_ago(now - as.difftime(14, units = "mins")) time_ago(now - as.difftime(5, units = "hours")) time_ago(now - as.difftime(25, units = "hours")) time_ago(now - as.difftime(5, units = "days")) time_ago(now - as.difftime(30, units = "days")) time_ago(now - as.difftime(365, units = "days")) time_ago(now - as.difftime(365 * 10, units = "days")) ## Short format time_ago(format = "short", now) time_ago(format = "short", now - as.difftime(30, units = "secs")) time_ago(format = "short", now - as.difftime(14, units = "mins")) time_ago(format = "short", now - as.difftime(5, units = "hours")) time_ago(format = "short", now - as.difftime(25, units = "hours")) time_ago(format = "short", now - as.difftime(5, units = "days")) time_ago(format = "short", now - as.difftime(30, units = "days")) time_ago(format = "short", now - as.difftime(365, units = "days")) time_ago(format = "short", now - as.difftime(365 * 10, units = "days")) ## Even shorter, terse format, (almost always) exactly 3 characters wide time_ago(format = "terse", now) time_ago(format = "terse", now - as.difftime(30, units = "secs")) time_ago(format = "terse", now - as.difftime(14, units = "mins")) time_ago(format = "terse", now - as.difftime(5, units = "hours")) time_ago(format = "terse", now - as.difftime(25, units = "hours")) time_ago(format = "terse", now - as.difftime(5, units = "days")) time_ago(format = "terse", now - as.difftime(30, units = "days")) time_ago(format = "terse", now - as.difftime(365, units = "days")) time_ago(format = "terse", now - as.difftime(365 * 10, units = "days")) } prettyunits/LICENSE0000644000176200001440000000005212413576266013702 0ustar liggesusersYEAR: 2014 COPYRIGHT HOLDER: Gabor Csardi