@@ -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