[R] how to update a value in a list with lapply

David Winsemius dwinsemius at comcast.net
Sun May 10 21:14:39 CEST 2015


On May 10, 2015, at 6:11 AM, ce wrote:

> 
> yes indeed :
> 
> foo <- lapply(foo, function(x) if(x[1] == 1 ) {x[2] <- 0; x }else{x} )
> 
> would work. But if the list is too long, would it be time consuming  rather than just updating elements that meet the if condition?

Any change to an object will require copying the entire object. That is the computing model that R uses. If you had presented a modification strategy that used logical or numeric indexing to effect only targeted nodes of a list, it still would have ended up copying the whole object.

The data.table package was invented in large part to get around that design concern.

-- 
David.

> 
> thx
> ce
> 
> 
> -----Original Message-----
> From: "David Winsemius" [dwinsemius at comcast.net]
> Date: 05/09/2015 08:00 PM
> To: "ce" <zadig_1 at excite.com>
> CC: r-help at r-project.org
> Subject: Re: [R] how to update a value in a list with lapply
> 
> 
> On May 9, 2015, at 4:35 PM, ce wrote:
> 
>> Dear All,
>> 
>> I have a list, using lapply I find some elements of the list, and then I want to change the values I find. but it doesn't work:
>> 
>> foo<-list(A = c(1,3), B =c(1, 2), C = c(3, 1))
>> lapply(foo, function(x) if(x[1] == 1 ) x )
>> $A
>> [1] 1 3
>> 
>> $B
>> [1] 1 2
>> 
>> $C
>> NULL
>> 
>> lapply(foo, function(x) if(x[1] == 1 ) x[2] <- 0 )
>> $A
>> [1] 0
>> 
>> $B
>> [1] 0
>> 
>> $C
>> NULL
>> 
>>> lapply(foo, function(x) if(x[1] == 1 ) x )
>> $A
>> [1] 1 3
>> 
>> $B
>> [1] 1 2
>> 
>> $C
>> NULL
>> 
>> 
>> how to do it correctly ?
> 
> I find it useful to think of the `if` function as `if(cond){cons}else{alt}`
> 
> lapply(foo, function(x)  if(x[1] == 1 ) {x[2] <- 0; x }else{x} )
> #-----
> $A
> [1] 1 0
> 
> $B
> [1] 1 0
> 
> $C
> [1] 3 1
> 
> 
> You were not supply an alternative which was the cause of the NULL (and you were not returning a value which meant that the value returned was the value on the RHS of the assignment).
> 
> -- 
> 
> David Winsemius
> Alameda, CA, USA
> 
> 

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list