From 5f1e0d650186311d4ae2f4fb86849a187e4eda00 Mon Sep 17 00:00:00 2001 From: Kevin Ushey Date: Mon, 30 Jun 2014 10:14:06 -0700 Subject: [PATCH 1/2] Update roxygen --- NAMESPACE | 2 +- man/add_margins.Rd | 2 +- man/cast.Rd | 2 +- man/colsplit.Rd | 2 +- man/french_fries.Rd | 2 +- man/guess_value.Rd | 2 +- man/margins.Rd | 2 +- man/melt.Rd | 2 +- man/melt.array.Rd | 2 +- man/melt.data.frame.Rd | 2 +- man/melt.default.Rd | 2 +- man/melt.list.Rd | 2 +- man/melt_check.Rd | 2 +- man/parse_formula.Rd | 2 +- man/recast.Rd | 2 +- man/smiths.rd | 2 +- man/tips.rd | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 1f140ab..e6a868b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,4 @@ -# Generated by roxygen2 (4.0.0): do not edit by hand +# Generated by roxygen2 (4.0.1): do not edit by hand S3method(melt,array) S3method(melt,data.frame) diff --git a/man/add_margins.Rd b/man/add_margins.Rd index 07e1e96..dd8f7ae 100644 --- a/man/add_margins.Rd +++ b/man/add_margins.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{add_margins} \alias{add_margins} \title{Add margins to a data frame.} diff --git a/man/cast.Rd b/man/cast.Rd index aab4bf9..010e0c0 100644 --- a/man/cast.Rd +++ b/man/cast.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{cast} \alias{acast} \alias{cast} diff --git a/man/colsplit.Rd b/man/colsplit.Rd index 79bf465..cdbe440 100644 --- a/man/colsplit.Rd +++ b/man/colsplit.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{colsplit} \alias{colsplit} \title{Split a vector into multiple columns} diff --git a/man/french_fries.Rd b/man/french_fries.Rd index 9340844..9d4d516 100644 --- a/man/french_fries.Rd +++ b/man/french_fries.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \docType{data} \name{french_fries} \alias{french_fries} diff --git a/man/guess_value.Rd b/man/guess_value.Rd index 1d20f9a..acb4f0c 100644 --- a/man/guess_value.Rd +++ b/man/guess_value.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{guess_value} \alias{guess_value} \title{Guess name of value column} diff --git a/man/margins.Rd b/man/margins.Rd index d20c69f..caf4e5f 100644 --- a/man/margins.Rd +++ b/man/margins.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{margins} \alias{margins} \title{Figure out margining variables.} diff --git a/man/melt.Rd b/man/melt.Rd index 6acc368..c10ee4e 100644 --- a/man/melt.Rd +++ b/man/melt.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{melt} \alias{melt} \title{Convert an object into a molten data frame.} diff --git a/man/melt.array.Rd b/man/melt.array.Rd index 07e3291..66f3c9d 100644 --- a/man/melt.array.Rd +++ b/man/melt.array.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{melt.array} \alias{melt.array} \alias{melt.matrix} diff --git a/man/melt.data.frame.Rd b/man/melt.data.frame.Rd index fa5d3c1..34fea13 100644 --- a/man/melt.data.frame.Rd +++ b/man/melt.data.frame.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{melt.data.frame} \alias{melt.data.frame} \title{Melt a data frame into form suitable for easy casting.} diff --git a/man/melt.default.Rd b/man/melt.default.Rd index 7456282..da0681b 100644 --- a/man/melt.default.Rd +++ b/man/melt.default.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{melt.default} \alias{melt.default} \title{Melt a vector. diff --git a/man/melt.list.Rd b/man/melt.list.Rd index 215821e..768f7ef 100644 --- a/man/melt.list.Rd +++ b/man/melt.list.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{melt.list} \alias{melt.list} \title{Melt a list by recursively melting each component.} diff --git a/man/melt_check.Rd b/man/melt_check.Rd index 9f0c61a..5a413eb 100644 --- a/man/melt_check.Rd +++ b/man/melt_check.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{melt_check} \alias{melt_check} \title{Check that input variables to melt are appropriate.} diff --git a/man/parse_formula.Rd b/man/parse_formula.Rd index ed4499a..7dba99b 100644 --- a/man/parse_formula.Rd +++ b/man/parse_formula.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{parse_formula} \alias{parse_formula} \title{Parse casting formulae.} diff --git a/man/recast.Rd b/man/recast.Rd index 361b189..1b3a6a4 100644 --- a/man/recast.Rd +++ b/man/recast.Rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \name{recast} \alias{recast} \title{Recast: melt and cast in a single step} diff --git a/man/smiths.rd b/man/smiths.rd index 93772cc..2ea8e25 100644 --- a/man/smiths.rd +++ b/man/smiths.rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \docType{data} \name{smiths} \alias{smiths} diff --git a/man/tips.rd b/man/tips.rd index c965aac..588c610 100644 --- a/man/tips.rd +++ b/man/tips.rd @@ -1,4 +1,4 @@ -% Generated by roxygen2 (4.0.0): do not edit by hand +% Generated by roxygen2 (4.0.1): do not edit by hand \docType{data} \name{tips} \alias{tips} From 0658e7c9fb5b3dffc1aaf68a3e9f05995cbb007f Mon Sep 17 00:00:00 2001 From: Kevin Ushey Date: Mon, 30 Jun 2014 10:18:02 -0700 Subject: [PATCH 2/2] Make sure OBJECT bit appropriately set when melting (#50) --- NEWS.md | 2 ++ src/melt.cpp | 11 +++++------ tests/testthat/test-melt.r | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/NEWS.md b/NEWS.md index 59f2499..c70f539 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # Version 1.4.0.99 +* `melt.data.frame()` now properly sets the OBJECT bit on `value` variable generated if attributes are copied (for example, when multiple POSIXct columns are concatenated to generate the `value` variable) (#50) + * `melt.data.frame()` no longer errors when `measure.vars` is `NULL` or empty. (#46) diff --git a/src/melt.cpp b/src/melt.cpp index 3d811bc..976f5c0 100644 --- a/src/melt.cpp +++ b/src/melt.cpp @@ -267,12 +267,11 @@ List melt_dataframe(const DataFrame& data, output[n_id + 1] = concatenate(data, measure_ind, factorsAsStrings); if (!Rf_isNull(measure_attributes)) { SET_ATTRIB(output[n_id + 1], measure_attributes); - } - - // Set the object bit explicitly to make sure that the 'value' is properly - // interpreted as a factor - if (valueAsFactor) { - SET_OBJECT(output[n_id + 1], 1); + // we also need to make sure the OBJECT bit is set for other 'object' types + // see: http://stackoverflow.com/questions/24059460/melt-data-frame-changes-behavior-how-posixct-columns-are-printed + // if we've entered this code block, the measure_attributes has been + // populated because all value variables have identical attributes + SET_OBJECT(output[n_id + 1], OBJECT(data[measure_ind[0]])); } // Make the List more data.frame like diff --git a/tests/testthat/test-melt.r b/tests/testthat/test-melt.r index 4b0aa2d..27d57e6 100644 --- a/tests/testthat/test-melt.r +++ b/tests/testthat/test-melt.r @@ -183,3 +183,18 @@ test_that("melt.data.frame behaves when there are no measure variables", { expect_identical(df["x"], m) }) + +test_that("melt.data.frame preserves OBJECT bit on e.g. POSIXct", { + t.wide <- data.frame(product=letters[1:5], + result=c(2, 4, 0, 0, 1), + t1=as.POSIXct("2014-05-26") + seq(0, 10800, length.out=5), + t2=as.POSIXct("2014-05-27") + seq(0, 10800, length.out=5), + t3=as.POSIXct("2014-05-28") + seq(0, 10800, length.out=5)) + + library(reshape2) + object_bit_set <- function(x) { + grepl("\\[OBJ", capture.output(.Internal(inspect(x)))[1]) + } + t.long <- melt(t.wide, measure.vars=c("t1", "t2", "t3"), value.name="time") + expect_true(object_bit_set(t.long$time)) +})