Skip to content

Commit f08d364

Browse files
committed
refactor, doc, example for melt(id.vars=patterns())
1 parent 267c830 commit f08d364

File tree

2 files changed

+14
-16
lines changed

2 files changed

+14
-16
lines changed

R/fmelt.R

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -182,20 +182,17 @@ melt.data.table = function(data, id.vars, measure.vars, variable.name = "variabl
182182
value.name = "value", ..., na.rm = FALSE, variable.factor = TRUE, value.factor = FALSE,
183183
verbose = getOption("datatable.verbose")) {
184184
if (!is.data.table(data)) stopf("'data' must be a data.table")
185-
if (missing(id.vars)) id.vars=NULL
186-
id.sub = substitute(id.vars)
187-
if (is.call(id.sub)) {
188-
eval.result = eval_with_cols(id.sub, names(data))
189-
if (!is.null(eval.result)) {
190-
id.vars = eval.result
191-
}
192-
}
193-
if (missing(measure.vars)) measure.vars = NULL
194-
measure.sub = substitute(measure.vars)
195-
if (is.call(measure.sub)) {
196-
eval.result = eval_with_cols(measure.sub, names(data))
197-
if (!is.null(eval.result)) {
198-
measure.vars = eval.result
185+
for(type.vars in c("id.vars","measure.vars")){
186+
sub.lang <- substitute({
187+
if (missing(VAR)) VAR=NULL
188+
substitute(VAR)
189+
}, list(VAR=as.symbol(type.vars)))
190+
sub.result = eval(sub.lang)
191+
if (is.call(sub.result)) {
192+
eval.result = eval_with_cols(sub.result, names(data))
193+
if (!is.null(eval.result)) {
194+
assign(type.vars, eval.result)
195+
}
199196
}
200197
}
201198
if (is.list(measure.vars)) {

man/melt.data.table.Rd

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ multiple columns simultaneously.
1919
\arguments{
2020
\item{data}{ A \code{data.table} object to melt.}
2121
\item{id.vars}{vector of id variables. Can be integer (corresponding id
22-
column numbers) or character (id column names) vector. If missing, all
23-
non-measure columns will be assigned to it. If integer, must be positive; see Details. }
22+
column numbers) or character (id column names) vector, perhaps created using \code{patterns()}. If missing, all
23+
non-measure columns will be assigned to it. If integer, must be positive; see Details.}
2424
\item{measure.vars}{Measure variables for \code{melt}ing. Can be missing, vector, list, or pattern-based.
2525
2626
\itemize{
@@ -131,6 +131,7 @@ melt(DT, id.vars=1, measure.vars=c("c_1", "c_2"), na.rm=TRUE) # remove NA
131131
# melt "f_1,f_2" and "d_1,d_2" simultaneously, retain 'factor' attribute
132132
# convenient way using internal function patterns()
133133
melt(DT, id.vars=1:2, measure.vars=patterns("^f_", "^d_"), value.factor=TRUE)
134+
melt(DT, id.vars=patterns("[in]"), measure.vars=patterns("^f_", "^d_"), value.factor=TRUE)
134135
# same as above, but provide list of columns directly by column names or indices
135136
melt(DT, id.vars=1:2, measure.vars=list(3:4, c("d_1", "d_2")), value.factor=TRUE)
136137
# same as above, but provide names directly:

0 commit comments

Comments
 (0)