diff --git a/R/fmelt.R b/R/fmelt.R index c6f435578..6ebbaa4c1 100644 --- a/R/fmelt.R +++ b/R/fmelt.R @@ -195,6 +195,16 @@ melt.data.table = function(data, id.vars, measure.vars, variable.name = "variabl } } } + +# GSoC Fix for #6512 + if (is.character(measure.vars)) { + invalid_vars <- setdiff(measure.vars, names(data)) + if (length(invalid_vars)) { + stopf("One or more values in 'measure.vars' is invalid; please fix by removing [%s]", + toString(invalid_vars)) + } + } + if (is.list(measure.vars)) { meas.nm = names(measure.vars) if (is.null(meas.nm)) { diff --git a/inst/tests/tests.Rraw b/inst/tests/tests.Rraw index c7205e52a..8513196ae 100644 --- a/inst/tests/tests.Rraw +++ b/inst/tests/tests.Rraw @@ -21959,3 +21959,8 @@ test(2355.1, fread(txt, skip=0), data.table(V1 = c("b1", "c1"), a1 test(2355.2, fread(txt, skip=0, header=TRUE), data.table(V1 = c("b1", "c1"), a1 = c("b2", "c2"), a2 = c("b3", "c3")), warning="Added an extra default column name") test(2355.3, fread(txt, skip=0, header=FALSE), data.table(V1=character(), V2=character(), V3=character()), warning="Consider fill=TRUE") test(2355.4, fread(txt, skip=0, fill=TRUE), data.table(V1 = c("a1", "b1", "c1"), V2 = c("a2", "b2", "c2"), V3 = c("", "b3", "c3"))) + +# Test for issue #6512: Informative error message for missing measure.vars +DT = data.table(x1=1, x2=2) +test(2356.1, melt(DT, measure.vars=c("x1", "z1")), + error="One or more values in 'measure.vars' is invalid; please fix by removing [z1]") diff --git a/src/fmelt.c b/src/fmelt.c index d6843c3ac..126e6ff00 100644 --- a/src/fmelt.c +++ b/src/fmelt.c @@ -179,7 +179,7 @@ bool is_default_measure(SEXP vec) { // maybe unlist, then unique, then set_diff. SEXP uniq_diff(SEXP int_or_list, int ncol, bool is_measure) { SEXP int_vec = PROTECT(isNewList(int_or_list) ? unlist_(int_or_list) : int_or_list); - SEXP is_duplicated = PROTECT(duplicated(int_vec, FALSE)); + SEXP is_duplicated = PROTECT(duplicated(int_vec, FALSE)); int n_unique_cols = 0; for (int i=0; i