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 rkoenker at 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.korpela at 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