[Rd] `dendrapply` Enhancements
Ivan Krylov
kry|ov@r00t @end|ng |rom gm@||@com
Thu Mar 2 15:47:50 CET 2023
Dear Aidan Lakshman,
To answer your implicit question, VECTOR_ELT() unclasses the nodes
because it doesn't go through the stats:::`[[.dendrogram` method,
instead dereferencing the data pointer directly.
Other *apply functions in base R create a call to the `[[` operator,
letting the language dispatch the generic call, allowing the method to
assign a class to the return value. The following example is taken from
src/main/apply.c:do_lapply():
// prepare a call to FUN(X[[i]], ...)
SEXP isym = install("i");
SEXP tmp = PROTECT(lang3(R_Bracket2Symbol, X, isym));
SEXP R_fcall = PROTECT(lang3(FUN, tmp, R_DotsSymbol));
MARK_NOT_MUTABLE(R_fcall);
// inside the loop: evaluate the call
tmp = R_forceAndCall(R_fcall, 1, rho);
Not sure which way is faster, but it may make sense to try, and it's
probably more correct in (contrived) cases where unclass(node)[[i]] is
invalid because it relies on a hypothetical `[[.subclass-of-dendrogram`
to restore some invariants.
Would you mind telling me more about the following case?
> if(!(inherits(res,c('dendrogram', 'list')))){
> res1 <- lapply(unclass(node), \(x) x)
> }
If you're looking to improve the performance, there might be a way to
avoid the wrapper and this lapply(unclass(node), identity) call in it.
--
Best regards,
Ivan
More information about the R-devel
mailing list