Skip to content
Back to formatted view

Raw Message

Message-ID: <4993201E.8000509@idi.ntnu.no>
Date: 2009-02-11T18:59:42Z
From: Wacek Kusnierczyk
Subject: Variables captured in closures get copied?
In-Reply-To: <49930870.3010409@biostat.ku.dk>

Peter Dalgaard wrote:
> Titus von der Malsburg wrote:
>> Hi list!  I have a data frame called fix and a list of index vectors
>> called rois:
>>
>>   > head(rois, 3)
>>   [[1]]
>>   [1] 2 1
>>
>>   [[2]]
>>   [1] 3
>>
>>   [[3]]
>>   [1]  6  7 28 26 27 24 25
>>
>> The part that's causing the issue is the following line:
>>
>>   lapply(rois, function(roi) fix$x[roi] <- 100)
>>
>> So for every index vector I'd like to set the respective entries in the
>> data frame (fix) to 100.
>>
>> I expected the data frame would be changed after lapply but instead it
>> remains unchanged.  I understand that when I pass an argument into a
>> function it gets passed as a value and not as a reference.  But here fix
>> is not an argument but captured in the closure.  Do my questions are:
>> What's going on here and what is the idiomatic way of achieving my goal?
>>
>
> It's a local variable in the function. Not in principle different from
>
> function(roi) { fix <- fix ;  ... }
>
> You could use superassignment (<<-), but a simpler idiom is
>
> for (roi in rois) fix$x[roi] <- 100
>

interesting.  i'm not sure if this is something one should consider
obvious, though it does make sense.
actually, it seems that r gets caught by surprise on such sort of semantics:

d = data,frame(x=1:10^8)
(function() d$x[1] = 0)()

prints 'Error: cannot allocate vector of size 762.9 Mb' and stops
responding with 100% cpu (sometimes even 101, as reported by top, hehe)
occupied by r.

platform       i686-pc-linux-gnu          
arch           i686                       
os             linux-gnu                  
system         i686, linux-gnu            
status                                    
major          2                          
minor          8.0                        
year           2008                       
month          10                         
day            20                         
svn rev        46754                      
language       R                          
version.string R version 2.8.0 (2008-10-20)

vQ