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