On Mar 2, 2016, at 12:23 PM, Duncan Murdoch <murdoch.duncan at 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)