Skip to content

Commit ed1712e

Browse files
revert
1 parent 879198c commit ed1712e

File tree

1 file changed

+14
-21
lines changed

1 file changed

+14
-21
lines changed

src/fmelt.c

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -600,38 +600,31 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
600600
if (isNull(data->variable_table)) {
601601
if (!varfactor) {
602602
if (data->measure_is_list) {
603+
// Return integer indices for list measure.vars (consistency with docs)
603604
SET_VECTOR_ELT(ansvars, 0, target=allocVector(INTSXP, data->totlen));
604605
int *td = INTEGER(target);
605606
for (int j=0, ansloc=0; j<data->lmax; ++j) {
606607
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
607608
for (int k=0; k<thislen; ++k) td[ansloc++] = j+1;
608609
}
609610
} else {
611+
// same behavior for vector measure.vars: variable is column names
610612
SET_VECTOR_ELT(ansvars, 0, target=allocVector(STRSXP, data->totlen));
611-
if (data->lvalues == 1) {//one value column to output.
612-
const int *thisvaluecols = INTEGER(VECTOR_ELT(data->valuecols, 0));
613-
for (int j=0, ansloc=0; j<data->lmax; ++j) {
614-
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
615-
SEXP str = STRING_ELT(dtnames, thisvaluecols[j]-1);
616-
for (int k=0; k<thislen; ++k) SET_STRING_ELT(target, ansloc++, str);
617-
}
618-
} else {
619-
for (int j=0, ansloc=0, level=1; j<data->lmax; ++j) {
620-
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
621-
char buff[20];
622-
snprintf(buff, sizeof(buff), "%d", level++); // # notranslate
623-
SEXP s = mkChar(buff);
624-
for (int k=0; k<thislen; ++k) SET_STRING_ELT(target, ansloc++, s);
625-
}
613+
const int *thisvaluecols = INTEGER(VECTOR_ELT(data->valuecols, 0));
614+
for (int j=0, ansloc=0; j<data->lmax; ++j) {
615+
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
616+
SEXP str = STRING_ELT(dtnames, thisvaluecols[j]-1);
617+
for (int k=0; k<thislen; ++k) SET_STRING_ELT(target, ansloc++, str);
626618
}
627619
}
628620
} else {// varfactor==TRUE
629621
SET_VECTOR_ELT(ansvars, 0, target=allocVector(INTSXP, data->totlen));
630622
SEXP levels;
631623
int *td = INTEGER(target);
632624
if (data->measure_is_list) {
633-
levels = PROTECT(allocVector(STRSXP, data->lmax)); protecti++;
634-
for (int j=0; j<data->lmax; ++j) {
625+
int nlevel = data->lmax;
626+
levels = PROTECT(allocVector(STRSXP, nlevel)); protecti++;
627+
for (int j=0; j<nlevel; ++j) {
635628
char buff[20];
636629
snprintf(buff, sizeof(buff), "%d", j+1); // # notranslate
637630
SET_STRING_ELT(levels, j, mkChar(buff));
@@ -640,8 +633,8 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
640633
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
641634
for (int k=0; k<thislen; ++k) td[ansloc++] = j+1;
642635
}
643-
} else {
644-
if (data->lvalues == 1) { // one value column to output
636+
} else { // non-list measure.vars keeps legacy name-based levels
637+
if (data->lvalues == 1) {
645638
SEXP thisvaluecols = VECTOR_ELT(data->valuecols, 0);
646639
int len = length(thisvaluecols);
647640
levels = PROTECT(allocVector(STRSXP, len)); protecti++;
@@ -651,7 +644,7 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
651644
int numRemove = 0; // remove dups and any for which narm and all-NA
652645
int *md = INTEGER(m);
653646
for (int j=0; j<len; ++j) {
654-
if (md[j]!=j+1 || (data->narm && length(VECTOR_ELT(data->not_NA_indices, j))==0)) { numRemove++; md[j]=0; }
647+
if (md[j]!=j+1 /*dup*/ || (data->narm && length(VECTOR_ELT(data->not_NA_indices, j))==0)) { numRemove++; md[j]=0; }
655648
}
656649
if (numRemove) {
657650
SEXP newlevels = PROTECT(allocVector(STRSXP, len-numRemove)); protecti++;
@@ -664,7 +657,7 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
664657
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
665658
for (int k=0; k<thislen; ++k) td[ansloc++] = md[j];
666659
}
667-
} else { // multiple output columns
660+
} else {//multiple output columns.
668661
int nlevel=0;
669662
levels = PROTECT(allocVector(STRSXP, data->lmax)); protecti++;
670663
for (int j=0, ansloc=0; j<data->lmax; ++j) {

0 commit comments

Comments
 (0)