[R] Functional programming?
Roger Koenker
rkoenker at illinois.edu
Wed Mar 2 23:55:35 CET 2016
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
More information about the R-help
mailing list