On 7/7/19 17:41, Jialin Ma wrote: > Hi Abby, > > Thanks a lot for your paraphrasing and your suggestion! > > The problem of wrapping the list into a S3/S4 object, i.e. subclassing array > or matrix, is that one also has to define a bunch of methods for subsetting, > joining, etc, in order to make it behave like a list array. The reason is that > most R functions for subsetting, joining, etc. do not preserve class > attributes of the input, which is possibly by design.
Is it? One could argue that a more sensible behavior would be that things like `[`(..., drop=FALSE), rbind(), cbind(), etc... preserve the class attribute. Interestingly t() does that: m <- matrix(1:6, nrow=2) class(m) <- "foo" m # [,1] [,2] [,3] # [1,] 1 3 5 # [2,] 2 4 6 # attr(,"class") # [1] "foo" t(m) # [,1] [,2] # [1,] 1 2 # [2,] 3 4 # [3,] 5 6 # attr(,"class") # [1] "foo" but not aperm() (which in this case would be expected to be equivalent to t()): aperm(m, 2:1) # [,1] [,2] # [1,] 1 2 # [2,] 3 4 # [3,] 5 6 Reshaping also preserves the class: dim(m) <- c(6, 1) m # [,1] # [1,] 1 # [2,] 2 # [3,] 3 # [4,] 4 # [5,] 5 # [6,] 6 # attr(,"class") # [1] "foo" So if it makes sense for t() and reshaping, it's not clear why it wouldn't for [, aperm(), cbind(), etc...? H. > It is not desirable if a > simple matrix subsetting will remove the class attributes of the object. > > There are also many other common functions that are meant to drop the > attributes of the input, e.g. lapply, apply -- they are not generics and it is > not wise to override them. > > Overall, introducing a new S3/S4 class often brings some extra price in order > to maintain the correct behavior, which is why I tend to avoid them unless it > is necessary. > > Best regards, > Jialin > > On Sunday, July 7, 2019 4:43:59 PM PDT Abby Spurdle wrote: >> contains an array of question marks, which >> isn't helpful. >> >> Would it be possible for the print method for both matrices and arrays >> (conditional on having a list type), call the format method for each >> object, possibly creating a character matrix? >> Presumably there are other approaches, but the main thing is that the >> output is useful and it's easy for R users to control the way objects (in >> matrices and arrays) are printed. >> >>> Or is there any other place that I can override without introducing a new >> >> S3 class? >> >> In theory, the simplest approach is to redefine the print method for >> matrices. >> However, that would be unacceptable in a CRAN package, probably... >> >> So, unless R Core change the print method, you may have to create a matrix >> subclass. > > ______________________________________________ > R-devel@r-project.org mailing list > https://urldefense.proofpoint.com/v2/url?u=https-3A__stat.ethz.ch_mailman_listinfo_r-2Ddevel&d=DwIFAg&c=eRAMFD45gAfqt84VtBcfhQ&r=BK7q3XeAvimeWdGbWY_wJYbW0WYiZvSXAJJKaaPhzWA&m=CFwIFXl8lv7HqmAdD6GKNJ6jlR0VRL1Ek1iGNO_suAk&s=Mhiq-DX7GTrcmqUFXKjuATvQy8Zs6op359DAMvOrois&e= > -- Hervé Pagès Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024 E-mail: hpa...@fredhutch.org Phone: (206) 667-5791 Fax: (206) 667-1319 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel