Dear Sir,

In the functions  orderVector1, orderVector1l  (R-3.5.2/src/main/sort.c) there 
are two loops concerning nalast (lines 1096, 1105). I am not sure about the 
possibility of redefining them, so this function should be a little faster.

The first one (line 1096) can be included in the previous 'switch' block (line 
1079) (see below). And if you rewrite/duplicate this 'switch' block (line 1079) 
for the case nalast==false, you should be able to avoid the loop of line 1105.

Best regards,
Emilio



*** /home/emilio/Descargas/R-3.5.2/src/main/sort.c      2018-11-07 
00:15:02.000000000 +0100
--- /home/emilio/Descargas/R-3.5.2/src/main/sort2.c     2019-01-21 
11:13:07.414332755 +0100
***************
*** 1079,1099 ****
        switch (TYPEOF(key)) {
        case LGLSXP:
        case INTSXP:
!           for (i = 0; i < n; i++) isna[i] = (ix[i] == NA_INTEGER);
!           break;
        case REALSXP:
!           for (i = 0; i < n; i++) isna[i] = ISNAN(x[i]);
!           break;
        case STRSXP:
!           for (i = 0; i < n; i++) isna[i] = (sx[i] == NA_STRING);
!           break;
        case CPLXSXP:
!           for (i = 0; i < n; i++) isna[i] = ISNAN(cx[i].r) || ISNAN(cx[i].i);
!           break;
        default:
!           UNIMPLEMENTED_TYPE("orderVector1", key);
        }
!       for (i = 0; i < n; i++) numna += isna[i];
  
        if(numna)
            switch (TYPEOF(key)) {
--- 1079,1111 ----
        switch (TYPEOF(key)) {
        case LGLSXP:
        case INTSXP:
!         for (i = 0; i < n; i++) {
!               isna[i] = (ix[i] == NA_INTEGER);
!               numna += isna[i];
!         }
!         break;
        case REALSXP:
!         for (i = 0; i < n; i++){
!               isna[i] = ISNAN(x[i]);
!               numna += isna[i];
!         } 
!         break;
        case STRSXP:
!         for (i = 0; i < n; i++){
!               isna[i] = (sx[i] == NA_STRING);
!               numna += isna[i];
!         } 
!         break;
        case CPLXSXP:
!         for (i = 0; i < n; i++){
!               isna[i] = ISNAN(cx[i].r) || ISNAN(cx[i].i);
!               numna += isna[i];
!         } 
!         break;
        default:
!         UNIMPLEMENTED_TYPE("orderVector1", key);
        }
!       /*      for (i = 0; i < n; i++) numna += isna[i]; */
  
        if(numna)
            switch (TYPEOF(key)) {




-- 
=================================================
Emilio Torres Manzanera
Fac. de Comercio - Universidad de Oviedo
c/ Luis Moya 261, E-33203 Gijón (Spain)
Tel. 985 182 197 email: tor...@uniovi.es
=================================================
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to