[R] looping function through list

arun smartpink111 at yahoo.com
Thu Jan 2 20:36:58 CET 2014



#or
 mapply(emd2d,sapply(output1,`[`,1),sapply(output1,`[`,2))
#[1]       NaN -6.089909
A.K.


On Thursday, January 2, 2014 2:33 PM, arun <smartpink111 at yahoo.com> wrote:
Hi,
May be this helps:
 set.seed(42)
 output1 <- list(list(matrix(0,8,11),matrix(0,8,11)), list(matrix(rnorm(80),8,10),matrix(rnorm(80),8,10)))
 library(emdist)
 sapply(output1,function(x) {emd2d(x[[seq_along(x)[1]]],x[[seq_along(x)[2]]]) })
#[1]       NaN -6.089909

A.K.

I'm trying to apply a function to a list using rapply but I'm having 
trouble doing so. I'm trying to calculate the earth-movers distance 
using the emdist package. Every index in the list has two subindices. I 
want to calculate the earth-movers distance for these subindices 
iteratively. An example of the list: 

head(output)

[[1]] 
[[1]][[1]] 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] 
[1,]    0    0    0    0    0    0    0    0    0     0     0 
[2,]    0    0    0    0    0    0    0    0    0     0     0 
[3,]    0    0    0    0    0    0    0    0    0     0     0 
[4,]    0    0    0    0    0    0    0    0    0     0     0 
[5,]    0    0    0    0    0    0    0    0    0     0     0 
[6,]    0    0    0    0    0    0    0    0    0     0     0 
[7,]    0    0    0    0    0    0    0    0    0     0     0 
[8,]    0    0    0    0    0    0    0    0    0     0     0 

[[1]][[2]] 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] 
[1,]    0    0    0    0    0    0    0    0    0     0     0 
[2,]    0    0    0    0    0    0    0    0    0     0     0 
[3,]    0    0    0    0    0    0    0    0    0     0     0 
[4,]    0    0    0    0    0    0    0    0    0     0     0 
[5,]    0    0    0    0    0    0    0    0    0     0     0 
[6,]    0    0    0    0    0    0    0    0    0     0     0 
[7,]    0    0    0    0    0    0    0    0    0     0     0 
[8,]    0    0    0    0    0    0    0    0    0     0     0 


[[2]] 
[[2]][[1]] 
         [,1]     [,2]     [,3]     [,4]     [,5]    [,6]     [,7]     [,8]     [,9]    [,10] 
[1,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.549675 5.834462 5.401988 5.933774 
[2,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.304306 5.834462 5.401988 5.933774 
[3,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.485151 5.834462 5.401988 5.933774 
[4,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.691836 5.834462 5.401988 5.933774 
[5,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.691836 5.834462 5.401988 5.933774 
[6,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.691836 5.834462 5.401988 5.933774 
[7,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.691836 5.834462 5.401988 5.933774 
[8,] 1.336731 3.264521 4.567414 4.871417 4.386032 5.75678 6.691836 5.834462 5.401988 5.933774 
        [,11] 
[1,] 6.549675 
[2,] 6.304306 
[3,] 6.485151 
[4,] 6.790983 
[5,] 7.102360 
[6,] 7.211278 
[7,] 7.211278 
[8,] 7.164059 

[[2]][[2]] 
         [,1]     [,2]     [,3]     [,4]      [,5]     [,6]     [,7]     [,8]     [,9] 
[1,] 6.886406 8.814196 10.11709 10.42109  9.935707 11.30645 12.24151 11.38414 10.95166 
[2,] 6.641038 8.568828  9.87172 10.17572  9.690339 11.06109 11.99614 11.13877 10.70629 
[3,] 6.821883 8.749673 10.05257 10.35657  9.871184 11.24193 12.17699 11.31961 10.88714 
[4,] 7.127715 9.055504 10.35840 10.66240 10.177015 11.54776 12.48282 11.62545 11.19297 
[5,] 7.439092 9.366881 10.66977 10.97378 10.488392 11.85914 12.79420 11.93682 11.50435 
[6,] 7.749465 9.677255 10.98015 11.28415 10.798766 12.16951 13.10457 12.24720 11.81472 
[7,] 7.783697 9.711487 11.01438 11.31838 10.832998 12.20375 13.13880 12.28143 11.84895 
[8,] 7.500790 9.428580 10.73147 11.03548 10.550091 11.92084 12.85590 11.99852 11.56605 
        [,10]    [,11] 
[1,] 11.48345 12.76095 
[2,] 11.23808 12.51558 
[3,] 11.41893 12.69643 
[4,] 11.72476 13.00226 
[5,] 12.03613 13.31364 
[6,] 12.34651 13.62401 
[7,] 12.38074 13.65824 
[8,] 12.09783 13.37534 

I have tried combining rapply and do.call in this fashion but it has failed so far: 

library(emdist)
do.call(rbind, rapply(output, function(x,y) emd2d))

The error message I get is: 
Error in (function (..., deparse.level = 1)  : 
  cannot coerce type 'closure' to vector of type 'list'

Any ideas?




More information about the R-help mailing list