# [R] mapply & assign to generate functions

J Toll jctoll at gmail.com
Mon Mar 12 19:16:07 CET 2012

Bill and Brian,

Thank you both for the finding my error.  force() appears to do the trick.

Thanks again,

James

On Mon, Mar 12, 2012 at 1:09 PM, William Dunlap <wdunlap at tibco.com> wrote:
> I think that adding a force(i) to your inner function should fix things up.
>  > z <- mapply(assign,
>  +        c("half", "third", "quarter"),
>  +        lapply(2:4, function(i) {
>  +             force(i)
>  +             function(x) divide(x, i)}),
>  +        pos = 1)
>  > half(10)
>  [1] 5
>  > third(10)
>  [1] 3.333333
>  > quarter(10)
>  [1] 2.5
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>
>> -----Original Message-----
>> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
>> Of J Toll
>> Sent: Monday, March 12, 2012 10:47 AM
>> To: r-help
>> Subject: [R] mapply & assign to generate functions
>>
>> Hi,
>>
>> I have a problem that I'm finding a bit tricky.  I'm trying to use
>> mapply and assign to generate curried functions.  For example, if I
>> have the function divide
>>
>> divide <- function(x, y) {
>>   x / y
>> }
>>
>> And I want the end result to be functionally equivalent to:
>> half <- function(x) divide(x, 2)
>> third <- function(x) divide(x, 3)
>> quarter <- function(x) divide(x, 4)
>>
>> But I want to do it using mapply and assign:
>> mapply(assign,
>>        c("half", "third", "quarter"),
>>        lapply(2:4, function(i) {function(x) divide(x, i)}),
>>        pos = 1)
>>
>> The problem is in the third line.  I end up with 3 functions that are
>> all functionally equivalent to quarter().  Any suggestions on how to
>> get this to work properly.
>>
>> Thanks.
>>
>>
>> James