[R] looping function through list
arun
smartpink111 at yahoo.com
Thu Jan 2 20:33:08 CET 2014
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