[Rd] Format printing inside a matrix
Pages, Herve
hp@ge@ @end|ng |rom |redhutch@org
Mon Jul 8 06:32:29 CEST 2019
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 using 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: hpages using fredhutch.org
Phone: (206) 667-5791
Fax: (206) 667-1319
More information about the R-devel
mailing list