Skip to content

Commit 879198c

Browse files
keep non list path
1 parent 4d283ba commit 879198c

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

src/fmelt.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -600,31 +600,38 @@ 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)
604603
SET_VECTOR_ELT(ansvars, 0, target=allocVector(INTSXP, data->totlen));
605604
int *td = INTEGER(target);
606605
for (int j=0, ansloc=0; j<data->lmax; ++j) {
607606
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
608607
for (int k=0; k<thislen; ++k) td[ansloc++] = j+1;
609608
}
610609
} else {
611-
// same behavior for vector measure.vars: variable is column names
612610
SET_VECTOR_ELT(ansvars, 0, target=allocVector(STRSXP, data->totlen));
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);
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+
}
618626
}
619627
}
620628
} else {// varfactor==TRUE
621629
SET_VECTOR_ELT(ansvars, 0, target=allocVector(INTSXP, data->totlen));
622630
SEXP levels;
623631
int *td = INTEGER(target);
624632
if (data->measure_is_list) {
625-
int nlevel = data->lmax;
626-
levels = PROTECT(allocVector(STRSXP, nlevel)); protecti++;
627-
for (int j=0; j<nlevel; ++j) {
633+
levels = PROTECT(allocVector(STRSXP, data->lmax)); protecti++;
634+
for (int j=0; j<data->lmax; ++j) {
628635
char buff[20];
629636
snprintf(buff, sizeof(buff), "%d", j+1); // # notranslate
630637
SET_STRING_ELT(levels, j, mkChar(buff));
@@ -633,8 +640,8 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
633640
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
634641
for (int k=0; k<thislen; ++k) td[ansloc++] = j+1;
635642
}
636-
} else { // non-list measure.vars keeps legacy name-based levels
637-
if (data->lvalues == 1) {
643+
} else {
644+
if (data->lvalues == 1) { // one value column to output
638645
SEXP thisvaluecols = VECTOR_ELT(data->valuecols, 0);
639646
int len = length(thisvaluecols);
640647
levels = PROTECT(allocVector(STRSXP, len)); protecti++;
@@ -644,7 +651,7 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
644651
int numRemove = 0; // remove dups and any for which narm and all-NA
645652
int *md = INTEGER(m);
646653
for (int j=0; j<len; ++j) {
647-
if (md[j]!=j+1 /*dup*/ || (data->narm && length(VECTOR_ELT(data->not_NA_indices, j))==0)) { numRemove++; md[j]=0; }
654+
if (md[j]!=j+1 || (data->narm && length(VECTOR_ELT(data->not_NA_indices, j))==0)) { numRemove++; md[j]=0; }
648655
}
649656
if (numRemove) {
650657
SEXP newlevels = PROTECT(allocVector(STRSXP, len-numRemove)); protecti++;
@@ -657,7 +664,7 @@ SEXP getvarcols(SEXP DT, SEXP dtnames, Rboolean varfactor, Rboolean verbose, str
657664
const int thislen = data->narm ? length(VECTOR_ELT(data->not_NA_indices, j)) : data->nrow;
658665
for (int k=0; k<thislen; ++k) td[ansloc++] = md[j];
659666
}
660-
} else {//multiple output columns.
667+
} else { // multiple output columns
661668
int nlevel=0;
662669
levels = PROTECT(allocVector(STRSXP, data->lmax)); protecti++;
663670
for (int j=0, ansloc=0; j<data->lmax; ++j) {

0 commit comments

Comments
 (0)