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.
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
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
lapply(1:4, fn)
lapply(1:4, "^", 2)
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
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
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
fn <- function(i) c(i, i^2)