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? Thanks for any help! Titus
Variables captured in closures get copied?
3 messages · Titus von der Malsburg, Peter Dalgaard, Wacek Kusnierczyk
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
O__ ---- Peter Dalgaard ?ster Farimagsgade 5, Entr.B c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk) FAX: (+45) 35327907
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