|
1 | 1 | #include "data.table.h" |
2 | 2 | #include <Rdefines.h> |
| 3 | + |
| 4 | + |
3 | 5 | // #include <signal.h> // the debugging machinery + breakpoint aidee |
4 | 6 | // raise(SIGINT); |
5 | 7 |
|
@@ -176,8 +178,12 @@ bool is_default_measure(SEXP vec) { |
176 | 178 |
|
177 | 179 | // maybe unlist, then unique, then set_diff. |
178 | 180 | SEXP uniq_diff(SEXP int_or_list, int ncol, bool is_measure) { |
| 181 | + // Protect input list/vector, unlisting if necessary |
179 | 182 | SEXP int_vec = PROTECT(isNewList(int_or_list) ? unlist_(int_or_list) : int_or_list); |
| 183 | + |
| 184 | + // Check for duplicated elements in the input vector |
180 | 185 | SEXP is_duplicated = PROTECT(duplicated(int_vec, FALSE)); |
| 186 | + |
181 | 187 | int n_unique_cols = 0; |
182 | 188 | SEXP invalid_columns = PROTECT(allocVector(INTSXP, length(int_vec))); |
183 | 189 | int* invalid_col_ptr = INTEGER(invalid_columns); |
@@ -206,16 +212,23 @@ SEXP uniq_diff(SEXP int_or_list, int ncol, bool is_measure) { |
206 | 212 | } |
207 | 213 | SEXP unique_col_numbers = PROTECT(allocVector(INTSXP, n_unique_cols)); |
208 | 214 | int unique_i = 0; |
209 | | - for (int i=0; i<length(is_duplicated); ++i) { |
| 215 | + |
| 216 | + // Populate the unique column numbers into the new vector |
| 217 | + for (int i = 0; i < length(is_duplicated); ++i) { |
210 | 218 | if (!LOGICAL(is_duplicated)[i]) { |
211 | 219 | INTEGER(unique_col_numbers)[unique_i++] = INTEGER(int_vec)[i]; |
212 | 220 | } |
213 | 221 | } |
| 222 | + |
| 223 | + // Apply set difference to get final unique column indices |
214 | 224 | SEXP out = set_diff(unique_col_numbers, ncol); |
215 | 225 | UNPROTECT(4); |
216 | 226 | return out; |
217 | 227 | } |
218 | 228 |
|
| 229 | + |
| 230 | + |
| 231 | + |
219 | 232 | SEXP cols_to_int_or_list(SEXP cols, SEXP dtnames, bool is_measure) { |
220 | 233 | switch(TYPEOF(cols)) { |
221 | 234 | case STRSXP : return chmatch(cols, dtnames, 0); |
|
0 commit comments