Not sure this adds to, subtracts from, or obfuscates this thread, but ... > x <- list(a=1:3,b = log, c=letters[2],d=as.list(1:5))
> is.vector(x) [1] TRUE > dim(x) <- c(2,2) > is.matrix(x) [1] TRUE > is.vector(x) [1] FALSE > x [,1] [,2] [1,] Integer,3 "b" [2,] ? List,5 > x[2,1](5) Error: attempt to apply non-function ## because... > x[2,1] [[1]] function (x, base = exp(1)) .Primitive("log") ## thus ... > x[2,1][[1]](5) [1] 1.609438 ## as well as > x[[2]](5) [1] 1.609438 ## because it's still the case that ... > is.list(x) [1] TRUE ## it's a list with "dim" attribute and thus... > class(x) [1] "matrix" ## But it's not a vector: > is.vector(x) [1] FALSE I'm not sure all this is consistent, but I think a full understanding of the semantics probably requires poking into more musty corners of R than I can handle, anyway. Cheers, Bert On Tue, Apr 17, 2012 at 5:15 PM, David Winsemius <dwinsem...@comcast.net> wrote: > > On Apr 17, 2012, at 7:27 PM, Worik R wrote: > >> On Tue, Apr 17, 2012 at 11:52 PM, David Winsemius >> <dwinsem...@comcast.net>wrote: >> >>> >>> On Apr 17, 2012, at 12:13 AM, Worik R wrote: >>> >>> After a lot of processing I get a matrix into M. I expected each row and >>>> >>>> column to be a vector. But it is a list. >>>> >>> >>> This behavior is not the result of limitation in how R's sapply might >>> have >>> processed a purely numeric set of results, but is because you (probably) >>> returned a hetergeneous set of classes rom you inner function. Assuming >>> that "last" is actually function(x){tail,1}, then the structure of M is >>> >>> str(M) >>> List of 6 >>> [snip] >>> ..$ : chr [1:3] "aaa" "bbb" "ccc" >>> >>> Had the result been a more homogeneous collection, I sapply would have >>> returned an array of atomic numeric vectors. Try just returning a number: >>> >>>> M2 <- sapply(Qm, function(nm, DF){last(DF[DF[, "Name"]==nm,"Value"])}, >>> >>> DF) >>> >> >> Yes that returns a vector. I want a matrix. >> >> I see that my problem is that the columns of DF are not all the same type. >> Once I did that (made Value character) I get my matrix just as I need. SO >> it was I passed *in* that was the problem Not what I did with it inside >> sapply. In this case I would expect M to be a list. I am gobsmacked that >> a list can be considered a vector. Is that a bug? > > > No. It is by design. "list" is an acceptable storage mode for vector(). > >> It must be bad design? > > > That is (obviously) a matter of opinion. R is in the middle region between > LiSP and a strongly typed language. > >> >> I have been using R for a number of years (5?) and heavilly for two years. >> I am still getting bitten by these "features" in R. To my mind there are >> many places that R violates the *principle of least surprise. > > > I keep getting surprises as well. I did experience surprise at the point I > saw that is.vector() returning TRUE for a list. I think that means that > is.vector is rather less informative than I expected. Essentially only > language objects fail: > >> z <- as.formula("x ~ y") >> z > x ~ y >> is.vector(z) > [1] FALSE > > > Even expressions are vectors: > >> z <- expression( x ~ y) >> z > expression(x ~ y) >> is.vector(z) > [1] TRUE > > >> But it may >> be my mind that is at fault! What are other people's experience?* > > > I still have not fully wrapped my head around the higher levels of the > language. I thought reading Chamber's book would help, but it had too much > prose and did not present enough worked examples to sync with my learning > style. I'm still looking for a book that lets me use the language more > effectively. > > -- > David. > >> >> Worik >> >> >>>> class(M) >>> >>> [1] "numeric" >>>> >>>> str(M2) >>> >>> Named num [1:3] 0.6184 0.0446 0.3605 >>> - attr(*, "names")= chr [1:3] "aaa" "bbb" "ccc" >>> >>> -- >>> David. >>> >>>> >>>> R-Inferno says... >>>> >>>> "Arrays (including matrices) can be subscripted with a matrix of >>>> positive >>>> numbers. The subscripting matrix has as many columns as there are >>>> dimensions >>>> in the array—so two columns for a matrix. The result is a vector (not an >>>> array) >>>> containing the selected items." >>>> >>>> My version of R: >>>> version.string R version 2.12.1 (2010-12-16) >>>> >>>> Here is an example... >>>> >>>> Qm <- c("aaa", "bbb", "ccc") >>>>> >>>>> DF <- data.frame(Name=sample(Qm, replace=TRUE, size=22), >>>>> Value=runif(22), >>>>> >>>> stringsAsFactors=FALSE) >>>> >>>>> M <- sapply(Qm, function(nm, DF){last(DF[DF[, "Name"]==nm,])}, DF) >>>>> class(M) >>>>> >>>> [1] "matrix" >>>> >>>>> class(M[,1]) >>>>> >>>> [1] "list" >>>> >>>>> class(M[1,]) >>>>> >>>> [1] "list" >>>> >>>>> M >>>>> >>>> aaa bbb ccc >>>> Name "aaa" "bbb" "ccc" >>>> Value 0.4702648 0.274498 0.5529691 >>>> >>>>> DF >>>>> >>>> Name Value >>>> 1 ccc 0.99948920 >>>> 2 aaa 0.51921281 >>>> 3 aaa 0.10803943 >>>> 4 aaa 0.82265847 >>>> 5 ccc 0.83237260 >>>> 6 bbb 0.88250933 >>>> 7 aaa 0.41836131 >>>> 8 aaa 0.66197290 >>>> 9 ccc 0.01911771 >>>> 10 ccc 0.99994699 >>>> 11 bbb 0.35719884 >>>> 12 ccc 0.86274858 >>>> 13 bbb 0.57528579 >>>> 14 aaa 0.12452158 >>>> 15 aaa 0.44167731 >>>> 16 aaa 0.11660019 >>>> 17 ccc 0.55296911 >>>> 18 aaa 0.12796890 >>>> 19 bbb 0.44595741 >>>> 20 bbb 0.93024768 >>>> 21 aaa 0.47026475 >>>> 22 bbb 0.27449801 >>>> >>>>> >>>>> > > David Winsemius, MD > West Hartford, CT > > ______________________________________________ > R-help@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. -- Bert Gunter Genentech Nonclinical Biostatistics Internal Contact Info: Phone: 467-7374 Website: http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm ______________________________________________ R-help@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.