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

Reply via email to