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