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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel