Thanks, Gabor! Very elegant! > On Oct 23, 2020, at 4:15 PM, Gabor Grothendieck <ggrothendi...@gmail.com> > wrote: > > Recursively walk the formula performing the replacement: > > g <- function(e, ...) { > if (length(e) > 1) { > if (identical(e[[2]], as.name(names(list(...))))) { > e <- eval(e, list(...)) > } > if (length(e) > 1) for (i in 1:length(e)) e[[i]] <- Recall(e[[i]], ...) > } > e > } > > g(f, lambdas = 2:3) > ## y ~ qss(x, lambda = 2L) + qss(z, 3L) + s > > On Fri, Oct 23, 2020 at 9:33 AM Koenker, Roger W <rkoen...@illinois.edu> > wrote: >> >> Suppose I have a formula like this: >> >> f <- y ~ qss(x, lambda = lambdas[1]) + qss(z, lambdas[2]) + s >> >> I’d like a function, g(lambdas, f) that would take g(c(2,3), f) and produce >> the new >> formula: >> >> y ~ qss(x, lambda = 2) + qss(z, 3) + s >> >> For only two qss terms I have been using >> >> g <- function(lambdas, f){ >> F <- deparse(f) >> F <- gsub("lambdas\\[1\\]",lambdas[1],F) >> F <- gsub("lambdas\\[2\\]",lambdas[2],F) >> formula(F) >> } >> but this is ugly and doesn’t extend nicely to more qss terms. Isn’t there >> some >> bquote() magic that can be invoked? Or something else entirely? >> ______________________________________________ >> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. > > > > -- > Statistics & Software Consulting > GKX Group, GKX Associates Inc. > tel: 1-877-GKX-GROUP > email: ggrothendieck at gmail.com
______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.