[R] hopefully my last question on lapply

Petr Pikal petr.pikal at precheza.cz
Wed Jun 28 08:49:14 CEST 2006


Hi

or you can use
some.list <- vector("list", length(tradevectors))
for (i in length(tradevectors) some.list[[i]] <-
your.function(G[tradevectors[[i]]], B[tradevectors[[i]]])

HTH
Petr



On 27 Jun 2006 at 22:46, Marc Schwartz wrote:

From:           	Marc Schwartz <MSchwartz at mn.rr.com>
To:             	markleeds at verizon.net
Date sent:      	Tue, 27 Jun 2006 22:46:49 -0500
Copies to:      	r-help at stat.math.ethz.ch
Subject:        	Re: [R] hopefully my last question on lapply
Send reply to:  	MSchwartz at mn.rr.com
	<mailto:r-help-request at stat.math.ethz.ch?subject=unsubscribe>
	<mailto:r-help-request at stat.math.ethz.ch?subject=subscribe>

> On Tue, 2006-06-27 at 21:12 -0500, markleeds at verizon.net wrote:
> > Marc and many other people ( whose names escape me ) have been
> > very helpful in explaining the use of lapply to me.
> > 
> > In his last response, Marc explained that if tradevectors is a list
> > of vectors of different lengths ( excuse my terminology ) then
> > 
> > lapply(tradevectors,function(x) G[x]*B[x] )
> > 
> > will go through each component of the list as if it was a vector and
> > apply the element by element multiplication of G and B, ( G and B
> > are vectors ) Then, it again returns a list of vectors.
> > 
> > This is fine and I understand it.
> > 
> > What I find confusing is that sometimes I want
> > to take the two vectors G abd B and send them totally
> > into some function with the respective indices from
> > tradevectors not just the element by element index.
> > For example, suppose I have a function called
> > myfunction that takes two vectors as its inputs.
> > Then, here are my ideas for what could be done.
> > 
> > Attempt 1 : lapply(tradevectors,function(i) myfunction(G[i],B[i])
> > 
> > Attempt 2 : lapply(along=tradevectors),function(i)
> > myfunction(G[[i]],B[[i]]
> > 
> > 
> > In attempt1, I am just putting tradevectors and indexing
> > using the [] which I think won't work.  In attemp t2, I am using
> > along=tradevectors and using [[]].
> > 
> > I think # 2 is correct but could someone confirm this 
> > because I have quite large vectors and it's not easy at all
> > for me to check what's going on and I'm not so clear
> > with lapply usage. There's seem tobe many different ways
> > of setting up the first parameter in the call to lapply. 
> 
> Mark,
> 
> My presumption is that you want to pass the subsetted vectors G and B
> to myfunction() during each iteration along the list 'tradevectors'
> and then perform some more complex operation on them.  
> 
> Is that correct?
> 
> If so, then I think that you are misunderstanding what is happening in
> lapply(), when you use:
> 
>   lapply(tradevectors,function(i) myfunction(G[i], B[i]))
> 
> In this case, it is not the individual elements of G and B that are
> passed to myfunction() one pair at a time, but the entire subsetted
> G[i] and B[i] that are passed. The vector subsetting takes place
> BEFORE the vectors are passed to myfunction().
> 
> Thus, for example, let's use the original data that we have been
> working with here:
> 
> tempa <- c(4, 6, 10)
> 
> tempb <- c(11, 23, 39)
> 
> tradevectors <- mapply(seq, from = tempa, to = tempb)
> 
> X <- seq(2, 80, 2)
> Y <- 1:40
> 
> # myfunction() will take x and y, cbind() them,
> # print the result and then return a NULL to lapply
> # So for each iteration in lapply, the cbind/print will be 
> # executed once.
> myfunction <- function(x, y) 
> {
>   print(cbind(x, y))
>   NULL
> }
> 
> 
> > lapply(tradevectors,function(i) myfunction(X[i], Y[i]))
>       x  y
> [1,]  8  4
> [2,] 10  5
> [3,] 12  6
> [4,] 14  7
> [5,] 16  8
> [6,] 18  9
> [7,] 20 10
> [8,] 22 11
>        x  y
>  [1,] 12  6
>  [2,] 14  7
>  [3,] 16  8
>  [4,] 18  9
>  [5,] 20 10
>  [6,] 22 11
>  [7,] 24 12
>  [8,] 26 13
>  [9,] 28 14
> [10,] 30 15
> [11,] 32 16
> [12,] 34 17
> [13,] 36 18
> [14,] 38 19
> [15,] 40 20
> [16,] 42 21
> [17,] 44 22
> [18,] 46 23
>        x  y
>  [1,] 20 10
>  [2,] 22 11
>  [3,] 24 12
>  [4,] 26 13
>  [5,] 28 14
>  [6,] 30 15
>  [7,] 32 16
>  [8,] 34 17
>  [9,] 36 18
> [10,] 38 19
> [11,] 40 20
> [12,] 42 21
> [13,] 44 22
> [14,] 46 23
> [15,] 48 24
> [16,] 50 25
> [17,] 52 26
> [18,] 54 27
> [19,] 56 28
> [20,] 58 29
> [21,] 60 30
> [22,] 62 31
> [23,] 64 32
> [24,] 66 33
> [25,] 68 34
> [26,] 70 35
> [27,] 72 36
> [28,] 74 37
> [29,] 76 38
> [30,] 78 39
> [[1]]
> NULL
> 
> [[2]]
> NULL
> 
> [[3]]
> NULL
> 
> 
> Note that for each of the three iterations through tradevectors in
> lapply(), myfunction() prints out a multi-row matrix consisting of the
> subsetted vectors X and Y, using the indices provided in tradevectors.
> 
> The three final NULLs are then returned once lapply() has finished.
> 
> 
> In addition, note that this behavior is different than mapply(), where
> each argument in mapply() is passed in an element-by-element fashion
> to the function indicated as the first argument. That is the behavior
> that we are using above to create the sequences that become
> tradevectors. In that case, each element of tempa and tempb, in
> sequence, are passed one at a time as a single pair to seq(). That
> occurs three times.
> 
> HTH,
> 
> Marc Schwartz
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html

Petr Pikal
petr.pikal at precheza.cz



More information about the R-help mailing list