[R] assigning vector or matrix sparsely (for use with mclapply)

ivo welch ivo.welch at gmail.com
Wed Mar 28 05:15:50 CEST 2012


I wasn't thinking straight.

> old.data= 11:20
> recalc.please= (old.data%%2==0)
> old.data[recalc.please]
[1] 12 14 16 18 20
> new.data[recalc.please]= old.data[recalc.please]^2
Error in new.data[recalc.please] = old.data[recalc.please]^2 :
  object 'new.data' not found

# this is where I had given up, but the following works:

> new.data=old.data
> new.data[recalc.please]= old.data[recalc.please]^2
> new.data
 [1]  11 144  13 196  15 256  17 324  19 400

sorry, guys.

/iaw
----
Ivo Welch (ivo.welch at gmail.com)


On Tue, Mar 27, 2012 at 7:27 PM, ilai <keren at math.montana.edu> wrote:
> It is (at least for me) really unclear what the problem is, or how
> it's related to mclapply.
> You say
> " this works fine, except that what I want to get NA's in the return
>  positions that were not recalculated.  then, I can write
>>
>>  newdata$y <- ifelse ( is.na(olddata$y), mc.byselectrows( olddata,
>> is.na(olddata$y), fun.calc.y ), olddata$y )
> "
> Why ???
> Are you applying the function twice ?  than why not simply
> v1.1 <- mc.byselectrows( d, loc<1, function(x) x[,2]^2 )
> the second time ?
>
> If the problem is in keeping track of which rows got calculated, why
> not rename with the row.names omitted after mclapply (probably a good
> idea anyway):
>
> FUN.ON.ROWS <- function(.index, ...)
> as.matrix(FUN(data.notdone[.index,], ...))
>  soln <- mclapply( as.list(1:nrow(data.notdone)) , FUN.ON.ROWS, ... )
>  rv <- do.call("rbind", soln)  ## omits naming.
>  if (ncol(rv)==1){ rv <- as.vector(rv) ; names(rv) <- row.names(data.notdone) }
>  else rownames(rv) <- row.names(data.notdone)
>  rv
> }
>
> And finally, you don't even need row.names for c(v1,d[loc<1,2])
>
> Or am I missing something here ?
>
> BTW your code uses cat.stderr (which is local ? ) instead of cat, and
> has no call to multicore.
>
> Cheers
>
>
>
>>
> On Mon, Mar 26, 2012 at 4:28 PM, ivo welch <ivo.welch at gmail.com> wrote:
>> Dear R wizards---
>>
>> I have a wrapper on mclapply() that makes it a little easier for me to
>> do multiprocessing.  (Posting this may make life easier for other
>> googlers.)  I pass a data frame, a vector that tells me what rows
>> should be recomputed, and the function; and I get back a vector or
>> matrix of answers.
>>
>>   d <- data.frame( id=1:6, val=11:16 )
>>   loc <- c(TRUE,TRUE,FALSE,TRUE,FALSE,TRUE)
>>   v1 <- mc.byselectrows( d, loc, function(x) x[,2]^2 )
>>   v2 <- mc.byselectrows(d, loc, function(x) cbind(x[,2]^2,x[,2]^3))
>>
>> mc.byselectrows <- function(data.in, recalclist, FUN, ...) {
>>
>>   data.notdone <- data.in[recalclist,]
>>   cat.stderr("[mc.byselectrows: ", nrow(data.notdone), "rows to be
>> recomputed out of", nrow(data.in), "]\n")
>>
>>   FUN.ON.ROWS <- function(.index, ...)
>> as.matrix(FUN(data.notdone[.index,], ...))
>>   soln <- mclapply( as.list(1:nrow(data.notdone)) , FUN.ON.ROWS, ... )
>>   rv <- do.call("rbind", soln)  ## omits naming.
>>   if (ncol(rv)==1) rv <- as.vector(rv)
>>   rv
>> }
>>
>> this works fine, except that what I want to get NA's in the return
>> positions that were not recalculated.  then, I can write
>>
>>  newdata$y <- ifelse ( is.na(olddata$y), mc.byselectrows( olddata,
>> is.na(olddata$y), fun.calc.y ), olddata$y )
>>
>> I can do this very inelegantly, of course.  I can merge recalclist
>> into data.in and then write a loop that substitutes for the do.call to
>> rbind.  yikes.  or I could do the recalclist contingency inside the
>> FUN.ON.ROWS, but this is costly in terms of execution time.  are there
>> obvious solutions?  advice appreciated.
>>
>> regards,
>>
>> /iaw
>> ----
>> Ivo Welch (ivo.welch at gmail.com)
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list