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.