From 9c55364130f1161cbb28e9dfc7df3a649c7771a2 Mon Sep 17 00:00:00 2001 From: "Matthew T. Warkentin" Date: Wed, 15 Apr 2020 16:03:59 -0400 Subject: [PATCH 1/6] updated stretch to factor x and y columns by default --- R/cor_df.R | 5 +++-- R/output.R | 4 +++- R/reshape.R | 6 ++++-- man/rplot.Rd | 5 ++++- man/stretch.Rd | 4 +++- .../testthat/{stretch.txt => stretch-keep.order_FALSE.txt} | 2 +- tests/testthat/stretch-keep.order_TRUE.txt | 6 ++++++ tests/testthat/test-stretch.R | 7 +++++-- 8 files changed, 29 insertions(+), 10 deletions(-) rename tests/testthat/{stretch.txt => stretch-keep.order_FALSE.txt} (87%) create mode 100644 tests/testthat/stretch-keep.order_TRUE.txt diff --git a/R/cor_df.R b/R/cor_df.R index ff8ede1..0795734 100644 --- a/R/cor_df.R +++ b/R/cor_df.R @@ -118,7 +118,8 @@ rplot.cor_df <- function(rdf, shape = 16, colours = c("indianred2", "white", "skyblue1"), print_cor = FALSE, - colors) { + colors, + keep.order = TRUE) { if (!missing(colors)) colours <- colors @@ -127,7 +128,7 @@ rplot.cor_df <- function(rdf, row_order <- rdf$rowname # Convert data to relevant format for plotting - pd <- stretch(rdf, na.rm = TRUE) + pd <- stretch(rdf, na.rm = TRUE, keep.order = TRUE) pd$size = abs(pd$r) pd$label = fashion(pd$r) diff --git a/R/output.R b/R/output.R index 204354f..1a0d62b 100644 --- a/R/output.R +++ b/R/output.R @@ -73,6 +73,7 @@ fashion.default <- function(x, decimals = 2, leading_zeros = FALSE, na_print = " #' @param shape \code{\link{geom_point}} aesthetic. #' @param print_cor Boolean indicating whether the correlations should be printed over the shapes. #' @param colours,colors Vector of colors to use for n-color gradient. +#' @param keep.order Boolean indicating whether axis ordering should be the same as \code{rdf}. Argument passed on to \code{\link{stretch}}. #' @return Plots a correlation data frame #' @export #' @examples @@ -90,7 +91,8 @@ rplot <- function(rdf, shape = 16, colours = c("indianred2", "white", "skyblue1"), print_cor = FALSE, - colors) { + colors, + keep.order = TRUE) { UseMethod("rplot") } diff --git a/R/reshape.R b/R/reshape.R index ec48503..e378e54 100644 --- a/R/reshape.R +++ b/R/reshape.R @@ -106,6 +106,7 @@ focus_if.default <- function(x, .predicate, ..., mirror = FALSE) { #' matrix diagonal) should be dropped? Will automatically be set to TRUE if #' mirror is FALSE. #' @param remove.dups Removes duplicate entries, without removing all NAs +#' @param keep.order Boolean. Should x and y variables keep the same order as the columns in \code{x}? Default is \code{TRUE}. #' @return tbl with three columns (x and y variables, and their correlation) #' @export #' @examples @@ -116,16 +117,17 @@ focus_if.default <- function(x, .predicate, ..., mirror = FALSE) { #' x <- shave(x) # use shave to set upper triangle to NA and then... #' stretch(x, na.rm = FALSE) # omit all NAs, therefore keeping each #' # correlation only once. -stretch <- function(x, na.rm = FALSE, remove.dups = FALSE) { +stretch <- function(x, na.rm = FALSE, remove.dups = FALSE, keep.order = TRUE) { UseMethod("stretch") } #' @export -stretch.cor_df <- function(x, na.rm = FALSE, remove.dups = FALSE) { +stretch.cor_df <- function(x, na.rm = FALSE, remove.dups = FALSE, keep.order = TRUE) { if(remove.dups) x <- shave(x) row_name <- x$rowname x <- x[, colnames(x) != "rowname"] tb <- imap_dfr(x, ~tibble(x = .y, y = row_name, r = .x)) + if(keep.order) tb[,c("x", "y")] <- map_dfc(tb[,c("x", "y")], factor, levels = row_name) if(na.rm) tb <- tb[!is.na(tb$r), ] if(remove.dups) { stretch_unique(tb) diff --git a/man/rplot.Rd b/man/rplot.Rd index 7364864..c64e6dd 100644 --- a/man/rplot.Rd +++ b/man/rplot.Rd @@ -10,7 +10,8 @@ rplot( shape = 16, colours = c("indianred2", "white", "skyblue1"), print_cor = FALSE, - colors + colors, + keep.order = TRUE ) } \arguments{ @@ -24,6 +25,8 @@ that can be coerced to one (see \code{\link{as_cordf}}).} \item{colours, colors}{Vector of colors to use for n-color gradient.} \item{print_cor}{Boolean indicating whether the correlations should be printed over the shapes.} + +\item{keep.order}{Boolean indicating whether axis ordering should be the same as \code{rdf}. Argument passed on to \code{\link{stretch}}.} } \value{ Plots a correlation data frame diff --git a/man/stretch.Rd b/man/stretch.Rd index a6aaff8..aeb44f2 100644 --- a/man/stretch.Rd +++ b/man/stretch.Rd @@ -4,7 +4,7 @@ \alias{stretch} \title{Stretch correlation data frame into long format.} \usage{ -stretch(x, na.rm = FALSE, remove.dups = FALSE) +stretch(x, na.rm = FALSE, remove.dups = FALSE, keep.order = TRUE) } \arguments{ \item{x}{cor_df. See \code{\link{correlate}}.} @@ -14,6 +14,8 @@ matrix diagonal) should be dropped? Will automatically be set to TRUE if mirror is FALSE.} \item{remove.dups}{Removes duplicate entries, without removing all NAs} + +\item{keep.order}{Boolean. Should x and y variables keep the same order as the columns in \code{x}? Default is \code{TRUE}.} } \value{ tbl with three columns (x and y variables, and their correlation) diff --git a/tests/testthat/stretch.txt b/tests/testthat/stretch-keep.order_FALSE.txt similarity index 87% rename from tests/testthat/stretch.txt rename to tests/testthat/stretch-keep.order_FALSE.txt index 6f98887..c137711 100644 --- a/tests/testthat/stretch.txt +++ b/tests/testthat/stretch-keep.order_FALSE.txt @@ -1,4 +1,4 @@ -> str(stretch(d)) +> str(stretch(d, keep.order = FALSE)) Classes 'tbl_df', 'tbl' and 'data.frame': 16 obs. of 3 variables: $ x: chr "Sepal.Length" "Sepal.Length" "Sepal.Length" "Sepal.Length" ... $ y: chr "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" ... diff --git a/tests/testthat/stretch-keep.order_TRUE.txt b/tests/testthat/stretch-keep.order_TRUE.txt new file mode 100644 index 0000000..3f5dbed --- /dev/null +++ b/tests/testthat/stretch-keep.order_TRUE.txt @@ -0,0 +1,6 @@ +> str(stretch(d)) +Classes 'tbl_df', 'tbl' and 'data.frame': 16 obs. of 3 variables: + $ x: Factor w/ 4 levels "Sepal.Length",..: 1 1 1 1 2 2 2 2 3 3 ... + $ y: Factor w/ 4 levels "Sepal.Length",..: 1 2 3 4 1 2 3 4 1 2 ... + $ r: num NA -0.112 0.871 0.817 -0.112 ... + diff --git a/tests/testthat/test-stretch.R b/tests/testthat/test-stretch.R index f475a60..7c79be0 100644 --- a/tests/testthat/test-stretch.R +++ b/tests/testthat/test-stretch.R @@ -13,8 +13,11 @@ test_that("Converts to proper structure", { colnames(stretch(d)), c("x", "y", "r") ) - verify_output("stretch.txt", - str(stretch(d)) + verify_output("stretch-keep.order_TRUE.txt", + str(stretch(d)) + ) + verify_output("stretch-keep.order_FALSE.txt", + str(stretch(d, keep.order = FALSE)) ) }) From f5eec7e0e8ee601c7fcb0ffbe091515d4c9ea7af Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 23 Jun 2020 10:48:29 -0600 Subject: [PATCH 2/6] Use `.order`, with options "default" and "alphabet" --- R/cor_df.R | 4 ++-- R/output.R | 15 +++++++++----- R/reshape.R | 20 +++++++++++++------ stretch-keep.order_alphabet.txt | 3 +++ ...TRUE.txt => stretch-keep.order_default.txt | 4 ++-- tests/testthat/stretch-keep.order_FALSE.txt | 6 ------ .../testthat/stretch-keep.order_alphabet.txt | 3 +++ tests/testthat/stretch-keep.order_default.txt | 6 ++++++ tests/testthat/test-stretch.R | 12 +++++------ 9 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 stretch-keep.order_alphabet.txt rename tests/testthat/stretch-keep.order_TRUE.txt => stretch-keep.order_default.txt (58%) delete mode 100644 tests/testthat/stretch-keep.order_FALSE.txt create mode 100644 tests/testthat/stretch-keep.order_alphabet.txt create mode 100644 tests/testthat/stretch-keep.order_default.txt diff --git a/R/cor_df.R b/R/cor_df.R index bea3544..1aaea1a 100644 --- a/R/cor_df.R +++ b/R/cor_df.R @@ -115,7 +115,7 @@ rplot.cor_df <- function(rdf, colours = c("indianred2", "white", "skyblue1"), print_cor = FALSE, colors, - keep.order = TRUE) { + .order = "default") { if (!missing(colors)) colours <- colors @@ -124,7 +124,7 @@ rplot.cor_df <- function(rdf, row_order <- rdf$rowname # Convert data to relevant format for plotting - pd <- stretch(rdf, na.rm = TRUE, keep.order = TRUE) + pd <- stretch(rdf, na.rm = TRUE, .order = .order) pd$size = abs(pd$r) pd$label = fashion(pd$r) diff --git a/R/output.R b/R/output.R index 81b2ba5..0dfc5a4 100644 --- a/R/output.R +++ b/R/output.R @@ -69,11 +69,15 @@ fashion.default <- function(x, decimals = 2, leading_zeros = FALSE, na_print = " #' #' @param rdf Correlation data frame (see \code{\link{correlate}}) or object #' that can be coerced to one (see \code{\link{as_cordf}}). -#' @param legend Boolean indicating whether a legend mapping the colors to the correlations should be displayed. +#' @param legend Boolean indicating whether a legend mapping the colors to the +#' correlations should be displayed. #' @param shape \code{\link{geom_point}} aesthetic. -#' @param print_cor Boolean indicating whether the correlations should be printed over the shapes. +#' @param print_cor Boolean indicating whether the correlations should be +#' printed over the shapes. #' @param colours,colors Vector of colors to use for n-color gradient. -#' @param keep.order Boolean indicating whether axis ordering should be the same as \code{rdf}. Argument passed on to \code{\link{stretch}}. +#' @param .order Either "default", meaning x and y variables keep the same order +#' as the columns in \code{x}, or "alphabet", meaning the variables are +#' alphabetized. #' @return Plots a correlation data frame #' @export #' @examples @@ -91,8 +95,9 @@ rplot <- function(rdf, shape = 16, colours = c("indianred2", "white", "skyblue1"), print_cor = FALSE, - colors, - keep.order = TRUE) { + colors, + .order = c("default", "alphabet")) { + .order <- match.arg(.order) UseMethod("rplot") } diff --git a/R/reshape.R b/R/reshape.R index 942b882..f42962e 100644 --- a/R/reshape.R +++ b/R/reshape.R @@ -9,8 +9,8 @@ #' function, see \code{\link[dplyr]{select}}. #' #' @param x cor_df. See \code{\link{correlate}}. -#' @param ... One or more unquoted expressions separated by commas. Variable -#' names can be used as if they were positions in the data frame, so +#' @param ... One or more unquoted expressions separated by commas. Variable +#' names can be used as if they were positions in the data frame, so #' expressions like `x:y`` can be used to select a range of variables. #' @param .dots Use focus_ to do standard evaluations. See \code{\link[dplyr]{select}}. #' @param mirror Boolean. Whether to mirror the selected columns in the rows or @@ -106,7 +106,9 @@ focus_if.default <- function(x, .predicate, ..., mirror = FALSE) { #' matrix diagonal) should be dropped? Will automatically be set to TRUE if #' mirror is FALSE. #' @param remove.dups Removes duplicate entries, without removing all NAs -#' @param keep.order Boolean. Should x and y variables keep the same order as the columns in \code{x}? Default is \code{TRUE}. +#' @param .order Either "default", meaning x and y variables keep the same order +#' as the columns in \code{x}, or "alphabet", meaning the variables are +#' alphabetized. #' @return tbl with three columns (x and y variables, and their correlation) #' @export #' @examples @@ -117,17 +119,23 @@ focus_if.default <- function(x, .predicate, ..., mirror = FALSE) { #' x <- shave(x) # use shave to set upper triangle to NA and then... #' stretch(x, na.rm = FALSE) # omit all NAs, therefore keeping each #' # correlation only once. -stretch <- function(x, na.rm = FALSE, remove.dups = FALSE, keep.order = TRUE) { +stretch <- function(x, na.rm = FALSE, remove.dups = FALSE, + .order = c("default", "alphabet")) { + .order <- match.arg(.order) UseMethod("stretch") } #' @export -stretch.cor_df <- function(x, na.rm = FALSE, remove.dups = FALSE, keep.order = TRUE) { +stretch.cor_df <- function(x, na.rm = FALSE, remove.dups = FALSE, + .order = c("default", "alphabet")) { + .order <- match.arg(.order) if(remove.dups) x <- shave(x) row_name <- x$rowname x <- x[, colnames(x) != "rowname"] tb <- imap_dfr(x, ~tibble(x = .y, y = row_name, r = .x)) - if(keep.order) tb[,c("x", "y")] <- map_dfc(tb[,c("x", "y")], factor, levels = row_name) + if(.order == "default") { + tb[,c("x", "y")] <- map_dfc(tb[,c("x", "y")], factor, levels = row_name) + } if(na.rm) tb <- tb[!is.na(tb$r), ] if(remove.dups) { stretch_unique(tb) diff --git a/stretch-keep.order_alphabet.txt b/stretch-keep.order_alphabet.txt new file mode 100644 index 0000000..0b26750 --- /dev/null +++ b/stretch-keep.order_alphabet.txt @@ -0,0 +1,3 @@ +> str(stretch(d, .order = FALSE)) +Error in match.arg(.order): 'arg' must be NULL or a character vector + diff --git a/tests/testthat/stretch-keep.order_TRUE.txt b/stretch-keep.order_default.txt similarity index 58% rename from tests/testthat/stretch-keep.order_TRUE.txt rename to stretch-keep.order_default.txt index 3f5dbed..6611e15 100644 --- a/tests/testthat/stretch-keep.order_TRUE.txt +++ b/stretch-keep.order_default.txt @@ -1,6 +1,6 @@ > str(stretch(d)) -Classes 'tbl_df', 'tbl' and 'data.frame': 16 obs. of 3 variables: +tibble [16 x 3] (S3: tbl_df/tbl/data.frame) $ x: Factor w/ 4 levels "Sepal.Length",..: 1 1 1 1 2 2 2 2 3 3 ... $ y: Factor w/ 4 levels "Sepal.Length",..: 1 2 3 4 1 2 3 4 1 2 ... - $ r: num NA -0.112 0.871 0.817 -0.112 ... + $ r: num [1:16] NA -0.112 0.871 0.817 -0.112 ... diff --git a/tests/testthat/stretch-keep.order_FALSE.txt b/tests/testthat/stretch-keep.order_FALSE.txt deleted file mode 100644 index c137711..0000000 --- a/tests/testthat/stretch-keep.order_FALSE.txt +++ /dev/null @@ -1,6 +0,0 @@ -> str(stretch(d, keep.order = FALSE)) -Classes 'tbl_df', 'tbl' and 'data.frame': 16 obs. of 3 variables: - $ x: chr "Sepal.Length" "Sepal.Length" "Sepal.Length" "Sepal.Length" ... - $ y: chr "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" ... - $ r: num NA -0.112 0.871 0.817 -0.112 ... - diff --git a/tests/testthat/stretch-keep.order_alphabet.txt b/tests/testthat/stretch-keep.order_alphabet.txt new file mode 100644 index 0000000..0b26750 --- /dev/null +++ b/tests/testthat/stretch-keep.order_alphabet.txt @@ -0,0 +1,3 @@ +> str(stretch(d, .order = FALSE)) +Error in match.arg(.order): 'arg' must be NULL or a character vector + diff --git a/tests/testthat/stretch-keep.order_default.txt b/tests/testthat/stretch-keep.order_default.txt new file mode 100644 index 0000000..6611e15 --- /dev/null +++ b/tests/testthat/stretch-keep.order_default.txt @@ -0,0 +1,6 @@ +> str(stretch(d)) +tibble [16 x 3] (S3: tbl_df/tbl/data.frame) + $ x: Factor w/ 4 levels "Sepal.Length",..: 1 1 1 1 2 2 2 2 3 3 ... + $ y: Factor w/ 4 levels "Sepal.Length",..: 1 2 3 4 1 2 3 4 1 2 ... + $ r: num [1:16] NA -0.112 0.871 0.817 -0.112 ... + diff --git a/tests/testthat/test-stretch.R b/tests/testthat/test-stretch.R index 2cb8e05..74bc659 100644 --- a/tests/testthat/test-stretch.R +++ b/tests/testthat/test-stretch.R @@ -13,14 +13,12 @@ test_that("Converts to proper structure", { colnames(stretch(d)), c("x", "y", "r") ) -<<<<<<< HEAD - verify_output("stretch-keep.order_TRUE.txt", + verify_output("stretch-keep.order_default.txt", str(stretch(d)) ) - verify_output("stretch-keep.order_FALSE.txt", - str(stretch(d, keep.order = FALSE)) + verify_output("stretch-keep.order_alphabet.txt", + str(stretch(d, .order = FALSE)) ) -======= exp_res <- tibble::tribble( @@ -42,8 +40,8 @@ test_that("Converts to proper structure", { "Petal.Width", "Petal.Length", 0.962865431402796, "Petal.Width", "Petal.Width", NA ) - expect_equivalent(as.data.frame(stretch(d)), as.data.frame(exp_res)) ->>>>>>> master + expect_equivalent(as.data.frame(stretch(d, .order = "alphabet")), + as.data.frame(exp_res)) }) test_that("na.rm", { From fa883e3c8dd9acb306b0452fdf691255d2bfe01f Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 23 Jun 2020 10:48:39 -0600 Subject: [PATCH 3/6] Update NEWS --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index 38e03d1..8691349 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,8 @@ - Handle correlation of exactly zero or 1 in `network_plot()` (@s-scherrer, #89) +- Add `.order` argument to `stretch()` with options "default" and "alphabet" (@mattwarkentin, #99) + # corrr 0.4.2 - Updates to work with tibble 3.0.0 and dplyr 1.0.0 From 00b0c7dc126c772e0da3a2cff15d792dc9217082 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Tue, 23 Jun 2020 12:08:00 -0600 Subject: [PATCH 4/6] Redocument --- man/focus.Rd | 4 ++-- man/network_plot.Rd | 3 ++- man/rplot.Rd | 12 ++++++++---- man/stretch.Rd | 11 +++++++++-- stretch-keep.order_alphabet.txt | 3 --- stretch-keep.order_default.txt | 6 ------ 6 files changed, 21 insertions(+), 18 deletions(-) delete mode 100644 stretch-keep.order_alphabet.txt delete mode 100644 stretch-keep.order_default.txt diff --git a/man/focus.Rd b/man/focus.Rd index 4cc8a0f..5022d3e 100644 --- a/man/focus.Rd +++ b/man/focus.Rd @@ -12,8 +12,8 @@ focus_(x, ..., .dots, mirror) \arguments{ \item{x}{cor_df. See \code{\link{correlate}}.} -\item{...}{One or more unquoted expressions separated by commas. Variable -names can be used as if they were positions in the data frame, so +\item{...}{One or more unquoted expressions separated by commas. Variable +names can be used as if they were positions in the data frame, so expressions like `x:y`` can be used to select a range of variables.} \item{mirror}{Boolean. Whether to mirror the selected columns in the rows or diff --git a/man/network_plot.Rd b/man/network_plot.Rd index acef095..0f74271 100644 --- a/man/network_plot.Rd +++ b/man/network_plot.Rd @@ -21,7 +21,8 @@ that can be coerced to one (see \code{\link{as_cordf}}).} \item{min_cor}{Number from 0 to 1 indicating the minimum value of correlations (in absolute terms) to plot.} -\item{legend}{Boolean indicating whether a legend mapping the colors to the correlations should be displayed.} +\item{legend}{Boolean indicating whether a legend mapping the colors to the +correlations should be displayed.} \item{colours, colors}{Vector of colors to use for n-color gradient.} diff --git a/man/rplot.Rd b/man/rplot.Rd index c64e6dd..7b20712 100644 --- a/man/rplot.Rd +++ b/man/rplot.Rd @@ -11,22 +11,26 @@ rplot( colours = c("indianred2", "white", "skyblue1"), print_cor = FALSE, colors, - keep.order = TRUE + .order = c("default", "alphabet") ) } \arguments{ \item{rdf}{Correlation data frame (see \code{\link{correlate}}) or object that can be coerced to one (see \code{\link{as_cordf}}).} -\item{legend}{Boolean indicating whether a legend mapping the colors to the correlations should be displayed.} +\item{legend}{Boolean indicating whether a legend mapping the colors to the +correlations should be displayed.} \item{shape}{\code{\link{geom_point}} aesthetic.} \item{colours, colors}{Vector of colors to use for n-color gradient.} -\item{print_cor}{Boolean indicating whether the correlations should be printed over the shapes.} +\item{print_cor}{Boolean indicating whether the correlations should be +printed over the shapes.} -\item{keep.order}{Boolean indicating whether axis ordering should be the same as \code{rdf}. Argument passed on to \code{\link{stretch}}.} +\item{.order}{Either "default", meaning x and y variables keep the same order +as the columns in \code{x}, or "alphabet", meaning the variables are +alphabetized.} } \value{ Plots a correlation data frame diff --git a/man/stretch.Rd b/man/stretch.Rd index e82bc26..a0870f1 100644 --- a/man/stretch.Rd +++ b/man/stretch.Rd @@ -4,7 +4,12 @@ \alias{stretch} \title{Stretch correlation data frame into long format.} \usage{ -stretch(x, na.rm = FALSE, remove.dups = FALSE, keep.order = TRUE) +stretch( + x, + na.rm = FALSE, + remove.dups = FALSE, + .order = c("default", "alphabet") +) } \arguments{ \item{x}{cor_df. See \code{\link{correlate}}.} @@ -15,7 +20,9 @@ mirror is FALSE.} \item{remove.dups}{Removes duplicate entries, without removing all NAs} -\item{keep.order}{Boolean. Should x and y variables keep the same order as the columns in \code{x}? Default is \code{TRUE}.} +\item{.order}{Either "default", meaning x and y variables keep the same order +as the columns in \code{x}, or "alphabet", meaning the variables are +alphabetized.} } \value{ tbl with three columns (x and y variables, and their correlation) diff --git a/stretch-keep.order_alphabet.txt b/stretch-keep.order_alphabet.txt deleted file mode 100644 index 0b26750..0000000 --- a/stretch-keep.order_alphabet.txt +++ /dev/null @@ -1,3 +0,0 @@ -> str(stretch(d, .order = FALSE)) -Error in match.arg(.order): 'arg' must be NULL or a character vector - diff --git a/stretch-keep.order_default.txt b/stretch-keep.order_default.txt deleted file mode 100644 index 6611e15..0000000 --- a/stretch-keep.order_default.txt +++ /dev/null @@ -1,6 +0,0 @@ -> str(stretch(d)) -tibble [16 x 3] (S3: tbl_df/tbl/data.frame) - $ x: Factor w/ 4 levels "Sepal.Length",..: 1 1 1 1 2 2 2 2 3 3 ... - $ y: Factor w/ 4 levels "Sepal.Length",..: 1 2 3 4 1 2 3 4 1 2 ... - $ r: num [1:16] NA -0.112 0.871 0.817 -0.112 ... - From b387523aa16f341fc192d8339d8788643da39030 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Thu, 25 Jun 2020 10:28:50 -0600 Subject: [PATCH 5/6] Stretch does not change, but plot handling *does* change --- NEWS.md | 2 +- R/cor_df.R | 23 ++++++++++++------- R/reshape.R | 16 +++---------- man/stretch.Rd | 11 +-------- .../testthat/stretch-keep.order_alphabet.txt | 3 --- tests/testthat/stretch-keep.order_default.txt | 6 ----- tests/testthat/test-stretch.R | 9 +------- 7 files changed, 21 insertions(+), 49 deletions(-) delete mode 100644 tests/testthat/stretch-keep.order_alphabet.txt delete mode 100644 tests/testthat/stretch-keep.order_default.txt diff --git a/NEWS.md b/NEWS.md index 8691349..dc7d1d3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,7 +4,7 @@ - Handle correlation of exactly zero or 1 in `network_plot()` (@s-scherrer, #89) -- Add `.order` argument to `stretch()` with options "default" and "alphabet" (@mattwarkentin, #99) +- Add `.order` argument to `rplot()` with options "default" and "alphabet" (@mattwarkentin, #99) # corrr 0.4.2 diff --git a/R/cor_df.R b/R/cor_df.R index 1aaea1a..531532b 100644 --- a/R/cor_df.R +++ b/R/cor_df.R @@ -95,7 +95,7 @@ focus_if.cor_df <- function(x, .predicate, ..., mirror = FALSE) { to_keep <- map_lgl( x[, colnames(x) != "rowname"], .predicate, ... - ) + ) to_keep <- names(to_keep)[!is.na(to_keep) & to_keep] @@ -115,7 +115,9 @@ rplot.cor_df <- function(rdf, colours = c("indianred2", "white", "skyblue1"), print_cor = FALSE, colors, - .order = "default") { + .order = c("default", "alphabet")) { + + .order <- match.arg(.order) if (!missing(colors)) colours <- colors @@ -124,10 +126,15 @@ rplot.cor_df <- function(rdf, row_order <- rdf$rowname # Convert data to relevant format for plotting - pd <- stretch(rdf, na.rm = TRUE, .order = .order) + pd <- stretch(rdf, na.rm = TRUE) pd$size = abs(pd$r) pd$label = fashion(pd$r) + if(.order == "default") { + pd$x <- factor(pd$x, levels = row_order) + pd$y <- factor(pd$y, levels = rev(row_order)) + } + plot_ <- list( # Geoms geom_point(shape = shape), @@ -231,8 +238,8 @@ network_plot.cor_df <- function(rdf, scale_colour_gradientn(limits = c(-1, 1), colors = colours), # Plot the points geom_point(data = points, - aes(x, y), - size = 3, shape = 19, colour = "white"), + aes(x, y), + size = 3, shape = 19, colour = "white"), # Plot variable labels if (repel) ggrepel::geom_text_repel(data = points, aes(x, y, label = id), @@ -244,9 +251,9 @@ network_plot.cor_df <- function(rdf, fontface = 'bold', size = 5), # expand the axes to add space for curves expand_limits(x = c(min(points$x) - .1, - max(points$x) + .1), - y = c(min(points$y) - .1, - max(points$y) + .1) + max(points$x) + .1), + y = c(min(points$y) - .1, + max(points$y) + .1) ), # Theme and legends theme_void(), diff --git a/R/reshape.R b/R/reshape.R index f42962e..e50f3c9 100644 --- a/R/reshape.R +++ b/R/reshape.R @@ -32,7 +32,7 @@ focus <- function(x, ..., mirror = FALSE) { .dots = ..., ... = ..., mirror = mirror - ) + ) } #' Returns a correlation table with the selected fields only @@ -106,9 +106,6 @@ focus_if.default <- function(x, .predicate, ..., mirror = FALSE) { #' matrix diagonal) should be dropped? Will automatically be set to TRUE if #' mirror is FALSE. #' @param remove.dups Removes duplicate entries, without removing all NAs -#' @param .order Either "default", meaning x and y variables keep the same order -#' as the columns in \code{x}, or "alphabet", meaning the variables are -#' alphabetized. #' @return tbl with three columns (x and y variables, and their correlation) #' @export #' @examples @@ -119,23 +116,16 @@ focus_if.default <- function(x, .predicate, ..., mirror = FALSE) { #' x <- shave(x) # use shave to set upper triangle to NA and then... #' stretch(x, na.rm = FALSE) # omit all NAs, therefore keeping each #' # correlation only once. -stretch <- function(x, na.rm = FALSE, remove.dups = FALSE, - .order = c("default", "alphabet")) { - .order <- match.arg(.order) +stretch <- function(x, na.rm = FALSE, remove.dups = FALSE) { UseMethod("stretch") } #' @export -stretch.cor_df <- function(x, na.rm = FALSE, remove.dups = FALSE, - .order = c("default", "alphabet")) { - .order <- match.arg(.order) +stretch.cor_df <- function(x, na.rm = FALSE, remove.dups = FALSE) { if(remove.dups) x <- shave(x) row_name <- x$rowname x <- x[, colnames(x) != "rowname"] tb <- imap_dfr(x, ~tibble(x = .y, y = row_name, r = .x)) - if(.order == "default") { - tb[,c("x", "y")] <- map_dfc(tb[,c("x", "y")], factor, levels = row_name) - } if(na.rm) tb <- tb[!is.na(tb$r), ] if(remove.dups) { stretch_unique(tb) diff --git a/man/stretch.Rd b/man/stretch.Rd index a0870f1..277eb11 100644 --- a/man/stretch.Rd +++ b/man/stretch.Rd @@ -4,12 +4,7 @@ \alias{stretch} \title{Stretch correlation data frame into long format.} \usage{ -stretch( - x, - na.rm = FALSE, - remove.dups = FALSE, - .order = c("default", "alphabet") -) +stretch(x, na.rm = FALSE, remove.dups = FALSE) } \arguments{ \item{x}{cor_df. See \code{\link{correlate}}.} @@ -19,10 +14,6 @@ matrix diagonal) should be dropped? Will automatically be set to TRUE if mirror is FALSE.} \item{remove.dups}{Removes duplicate entries, without removing all NAs} - -\item{.order}{Either "default", meaning x and y variables keep the same order -as the columns in \code{x}, or "alphabet", meaning the variables are -alphabetized.} } \value{ tbl with three columns (x and y variables, and their correlation) diff --git a/tests/testthat/stretch-keep.order_alphabet.txt b/tests/testthat/stretch-keep.order_alphabet.txt deleted file mode 100644 index 0b26750..0000000 --- a/tests/testthat/stretch-keep.order_alphabet.txt +++ /dev/null @@ -1,3 +0,0 @@ -> str(stretch(d, .order = FALSE)) -Error in match.arg(.order): 'arg' must be NULL or a character vector - diff --git a/tests/testthat/stretch-keep.order_default.txt b/tests/testthat/stretch-keep.order_default.txt deleted file mode 100644 index 6611e15..0000000 --- a/tests/testthat/stretch-keep.order_default.txt +++ /dev/null @@ -1,6 +0,0 @@ -> str(stretch(d)) -tibble [16 x 3] (S3: tbl_df/tbl/data.frame) - $ x: Factor w/ 4 levels "Sepal.Length",..: 1 1 1 1 2 2 2 2 3 3 ... - $ y: Factor w/ 4 levels "Sepal.Length",..: 1 2 3 4 1 2 3 4 1 2 ... - $ r: num [1:16] NA -0.112 0.871 0.817 -0.112 ... - diff --git a/tests/testthat/test-stretch.R b/tests/testthat/test-stretch.R index 74bc659..21ecf1a 100644 --- a/tests/testthat/test-stretch.R +++ b/tests/testthat/test-stretch.R @@ -13,12 +13,6 @@ test_that("Converts to proper structure", { colnames(stretch(d)), c("x", "y", "r") ) - verify_output("stretch-keep.order_default.txt", - str(stretch(d)) - ) - verify_output("stretch-keep.order_alphabet.txt", - str(stretch(d, .order = FALSE)) - ) exp_res <- tibble::tribble( @@ -40,8 +34,7 @@ test_that("Converts to proper structure", { "Petal.Width", "Petal.Length", 0.962865431402796, "Petal.Width", "Petal.Width", NA ) - expect_equivalent(as.data.frame(stretch(d, .order = "alphabet")), - as.data.frame(exp_res)) + expect_equivalent(as.data.frame(stretch(d)), as.data.frame(exp_res)) }) test_that("na.rm", { From 42c980151baeb188d333b9b2499791defd9ccca6 Mon Sep 17 00:00:00 2001 From: Julia Silge Date: Thu, 25 Jun 2020 15:17:20 -0600 Subject: [PATCH 6/6] Reknit README, for new plot --- man/figures/README-combination-1.png | Bin 26275 -> 26167 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/man/figures/README-combination-1.png b/man/figures/README-combination-1.png index 125e851c3a3259c7c865376905c68f78dd3ebccc..da3395e2aa9a3f294784a168195d3508bcc659e8 100644 GIT binary patch literal 26167 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 literal 26275 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 wcY<_F