[R] Error with lapply

0 views
Skip to first unread message

megh

unread,
Nov 20, 2008, 11:31:41 AM11/20/08
to r-h...@r-project.org

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,


--
View this message in context: http://www.nabble.com/Error-with-lapply-tp20605066p20605066.html
Sent from the R help mailing list archive at Nabble.com.

______________________________________________
R-h...@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.

baptiste auguie

unread,
Nov 20, 2008, 11:43:20 AM11/20/08
to megh, r-h...@r-project.org
Hi,

you are feeding lapply "i" as an optional argument, which is passed to
fn() and causes an error. Just use lapply(1:4, fn), or better yet,
sapply,

> fn <- function(i) return(i^2)
> sapply(1:4, fn)
[1] 1 4 9 16

Hope this helps,

baptiste

_____________________________

Baptiste Auguié

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag

Marc Schwartz

unread,
Nov 20, 2008, 11:49:35 AM11/20/08
to megh, r-h...@r-project.org
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

Gabor Grothendieck

unread,
Nov 20, 2008, 11:57:07 AM11/20/08
to megh, r-h...@r-project.org
lapply already passes the first arg to fn and by specifying the
i (which is undefined -- its only defined within fn) it would be
trying to to pass a second arg to fn yet fn takes only takes
one arg. Try these:

lapply(1:4, fn)
lapply(1:4, "^", 2)

Bert Gunter

unread,
Nov 20, 2008, 12:06:08 PM11/20/08
to marc_s...@comcast.net, megh, r-h...@stat.math.ethz.ch

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

megh

unread,
Nov 22, 2008, 4:54:45 AM11/22/08
to r-h...@r-project.org

I need one more clarification here :

Here I did :

fn <- function(i) return(list(i, i^2))
ss = sapply(1:4, fn)

Here the object "ss" should be a matrix object :
is.matrix(ss)

However I feel it lacks some the matrix object properties. For example the
syntax "min(ss[1,])" generates an error :
"Error in min(ss[1, ]) : invalid 'type' (list) of argument".

What should be the way out? Am I missing something ?

Regards,

--
View this message in context: http://www.nabble.com/Error-with-lapply-tp20605066p20634821.html

Peter Dalgaard

unread,
Nov 22, 2008, 5:14:55 AM11/22/08
to megh, r-h...@r-project.org
megh wrote:
> I need one more clarification here :
>
> Here I did :
>
> fn <- function(i) return(list(i, i^2))
> ss = sapply(1:4, fn)
>
> Here the object "ss" should be a matrix object :
> is.matrix(ss)
>
> However I feel it lacks some the matrix object properties. For example the
> syntax "min(ss[1,])" generates an error :
> "Error in min(ss[1, ]) : invalid 'type' (list) of argument".
>
> What should be the way out? Am I missing something ?

ss is a dim'ed list object, because fn returns a list. This appears to
be a feature, although rarely used. One point is that you can do

> fn <- function(i) return(list(as.character(i), i^2))
> ss <- sapply(1:4, fn)
> ss
[,1] [,2] [,3] [,4]
[1,] "1" "2" "3" "4"
[2,] 1 4 9 16
> ss[,1]
[[1]]
[1] "1"

[[2]]
[1] 1

I.e., the rows can be of different mode.

The easiest way out is just not to do that, i.e. return a vectore c(i,
i^2) instead.


--
O__ ---- Peter Dalgaard Øster Farimagsgade 5, Entr.B
c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K
(*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918
~~~~~~~~~~ - (p.dal...@biostat.ku.dk) FAX: (+45) 35327907

Gabor Grothendieck

unread,
Nov 22, 2008, 5:16:53 AM11/22/08
to megh, r-h...@r-project.org
Try str(ss) to see what it really looks like. You probably want:

fn <- function(i) c(i, i^2)

Reply all
Reply to author
Forward
0 new messages