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.