Thanks again to all. This was highly educational for me. As it turned out Mikiko's suggestion turned out to be most easily adaptable to my real problem. I’m not at all able to evaluate relative efficiency at this point, but fortunately this isn’t an important factor (so far) in what I’m trying to do.
As always the knowledge and generosity of the R-help community is inspiring. url: www.econ.uiuc.edu/~roger Roger Koenker email rkoen...@uiuc.edu Department of Economics vox: 217-333-4558 University of Illinois fax: 217-244-6678 Urbana, IL 61801 > On Mar 2, 2016, at 1:25 PM, Mikko Korpela <mikko.korp...@aalto.fi> wrote: > > On 02.03.2016 18:47, Roger Koenker wrote: >> I have a (remarkably ugly!!) code snippet (below) that, given >> two simple functions, f and g, generates >> a list of new functions h_{k+1} = h_k * g, k= 1, …, K. Surely, there are >> vastly >> better ways to do this. I don’t particularly care about the returned list, >> I’d be happy to have the final h_K version of the function, >> but I keep losing my way and running into the dreaded: >> >> Error in h[[1]] : object of type 'closure' is not subsettable >> or >> Error: evaluation nested too deeply: infinite recursion / >> options(expressions=)? >> >> Mainly I’d like to get rid of the horrible, horrible paste/parse/eval evils. >> Admittedly >> the f,g look a bit strange, so you may have to suspend disbelief to imagine >> that there is >> something more sensible lurking beneath this minimal (toy) example. >> >> f <- function(u) function(x) u * x^2 >> g <- function(u) function(x) u * log(x) >> set.seed(3) >> a <- runif(5) >> h <- list() >> hit <- list() >> h[[1]] <- f(a[1]) >> hit[[1]] <- f(a[1]) >> for(i in 2:5){ >> ht <- paste("function(x) h[[", i-1, "]](x) * g(", a[i], ")(x)") >> h[[i]] <- eval(parse(text = ht)) >> hit[[i]] <- function(x) {force(i); return(h[[i]] (x))} >> } >> x <- 1:99/10 >> plot(x, h[[1]](x), type = "l") >> for(i in 2:5) >> lines(x, h[[i]](x), col = i) > > Here is my (ugly?) suggestion: > > f <- function(u) function(x) u * x^2 > g <- function(u) function(x) u * log(x) > set.seed(3) > a <- runif(5) > h <- f(a[1]) > for (i in 2:5) { > body(h) <- call("*", body(h), > as.call(list(do.call("g", list(a[i])), quote(x)))) > } > > -- > Mikko Korpela > Aalto University School of Science > Department of Computer Science ______________________________________________ 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.