[R] Error with lapply

Bert Gunter gunter.berton at gene.com
Thu Nov 20 18:06:08 CET 2008


 
To be clear, the problem is not the return statement in your function, but
the extra argument, i, in your lapply statement:

lapply(1:4,fn)

works just fine with your original function. You need to read ?lapply more
carefully: fn receives the values of the first argument (1:4) in turn
automatically; other arguments in lapply are passed in as **additional**
arguments to fn, of which there are none here.
Compare:

fn <- function(i,a)i^2+a
lapply(1:4,fn) ## error
lapply(1:4,fn,5)

Cheers,
Bert

Bert Gunter
Genentech


-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
Behalf Of Marc Schwartz
Sent: Thursday, November 20, 2008 8:50 AM
To: megh
Cc: r-help at r-project.org
Subject: Re: [R] Error with lapply

on 11/20/2008 10:31 AM megh wrote:
> I have written following codes, with intention to get a list with values
> 1,2,9,16 :
> 
> fn <- function(i) return(i^2)
> lapply(1:4, fn, i)
> 
> However I got following error :
> Error in FUN(1:4[[1L]], ...) : unused argument(s) (1)
> 
> Can anyone please tell me what will be the correct code here?
> 
> Regards,

Try this:

fn <- function(i) i^2

> lapply(1:4, fn)
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

[[4]]
[1] 16


The error message indicates that the argument 'i' that you have in your
initial attempt to use lappply() is unused, because the values 1:4 are
passed to the function's first argument by default already. Thus,
specifying 'i' again is an error, since there is not a second argument
in your function fn().

Note also that 'return()' is not needed, as per the Details in ?return:

"If the end of a function is reached without calling return, the value
of the last evaluated expression is returned."


Note also, that since lapply() effectively uses an internal loop, a
faster "vectorized" approach would be:

> as.list((1:4) ^ 2)
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

[[4]]
[1] 16


For example, using 100,000 instead of 4:

> system.time(x1 <- lapply(1:100000, fn))
   user  system elapsed
  0.500   0.015   0.600

> system.time(x2 <- as.list((1:100000) ^ 2))
   user  system elapsed
  0.018   0.004   0.039

> identical(x1, x2)
[1] TRUE


HTH,

Marc Schwartz

______________________________________________
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