Thanks, Roger: I think Duncan's approach is far more efficient, but I believe the following replicates your result and may be a bit easier to understand.
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) h[[i]] <- eval(bquote(function(x)h[[.(i-1)]](x)*g(a[.(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) } This uses recursion to "unwind" h[[i]] each time it's called, ergo the inefficiency. But in that sense,anyway, it seems to be more "functional." But certainly feel free to ignore. Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Wed, Mar 2, 2016 at 10:40 AM, Roger Koenker <rkoen...@illinois.edu> wrote: > Thanks, Duncan and Bert, > > Duncan’s version does replicate my result, Bert’s does something a bit > different, > now I just need some time to digest what you have done, and try to see how > and why. Many thanks!!! > > Roger > > 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 12:23 PM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote: >> >> On 02/03/2016 11:47 AM, 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) >> >> I don't understand what "hit" is for, but something like this should do it: >> >> >> hlist <- function(maxk, f,g,a) { >> h <- list() >> h[[1]] <- f(a[1]) >> for (j in 2:maxk) { >> h[[j]] <- local({ >> k <- j >> function(x) { >> result <- h[[1]](x) >> for (i in 2:k) { >> result <- result*g(a[i])(x) >> } >> result >> } >> }) >> } >> h >> } >> >> f <- function(u) function(x) u * x^2 >> g <- function(u) function(x) u * log(x) >> set.seed(3) >> a <- runif(5) >> h <- hlist(5, f, g, a) > ______________________________________________ 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.