>>>>> Ivan Krylov via R-devel writes: Thanks: I just changed xtfrm.AsIs() as suggested.
Best -k > В Fri, 12 Jul 2024 17:35:19 +0200 > Hilmar Berger via R-devel <r-devel@r-project.org> пишет: >> This can be finally traced to base::rank() (called from >> xtfrm.default), where I found that >> >> "NB: rank is not itself generic but xtfrm is, and rank(xtfrm(x), ....) >> will have the desired result if there is a xtfrm method. Otherwise, >> rank will make use of ==, >, is.na and extraction methods for classed >> objects, possibly rather slowly. " > The problem is indeed that the vector reaches base::rank in both cases, > but since it has a class, the function has to construct and evaluate a > call to .gt every time it wants to compare two elements. > xtfrm.AsIs even tries to remove the 'AsIs' class before continuing the > method dispatch process: >>> if (length(cl <- class(x)) > 1) oldClass(x) <- cl[-1L] > It doesn't work in the (very contrived) case when 'AsIs' is not the > first class and it doesn't remove 'AsIs' as the only class (making > static int equal(...) take the slower branch). What's going to break if > we allow removing the class attribute altogether? This seems to speed > up xtfrm(I(x)) and survive LC_ALL=C.UTF-8 make check-devel: > Index: src/library/base/R/sort.R > =================================================================== > --- src/library/base/R/sort.R (revision 86895) > +++ src/library/base/R/sort.R (working copy) > @@ -297,7 +297,8 @@ > xtfrm.AsIs <- function(x) > { > - if(length(cl <- class(x)) > 1) oldClass(x) <- cl[-1L] > + cl <- oldClass(x) > + oldClass(x) <- cl[cl != 'AsIs'] > NextMethod("xtfrm") > } > -- > Best regards, > Ivan > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel