Hi all,
I came across an issue in using the Matrix package which made it that I
could only subset Matrices using the numeric class, but could not using
integers. Steps to reproduce the problem:
library(Matrix)
# this class has *nothing* to do with Matrix
setClass("MyClass",
representation(myvalue = "numeric"),
prototype(myvalue = NA_real_))
# this class also has nothing to do with Matrix
setClassUnion("NumOrMyClass", c("numeric", "MyClass"))
# this is to demonstrate creating and subsetting a specific Matrix
m <- new("dgCMatrix", i = c(2L, 0L, 1L, 2L, 0L, 1L), p = c(0L, 1L, 2L, 4L,
4L, 6L),
Dim = c(3L, 5L), Dimnames = list(NULL, NULL), x = c(2, 1, 2, 1, 2, 1),
factors = list())
# this next line fails:
m[1:2, 1:2]
The last line fails consistently with R 3.6.1 and Matrix 1.2-17 on a
variety of operating systems and computers (tested with ubuntu 19.10 &
windows 10). I'll note at this point that without the class union I defined
above, the rest of the code works perfectly fine.
There are 2 workarounds I've come up with. Firstly, one could change the
last line to
m[as.numeric(1:2), as.numeric(1:2)]
or as.numeric(seq()) or c(1, 2), etc.
The other workaround is to change setClassUnion("NumOrMyClass",
c("numeric", "MyClass")) to setClassUnion("NumOrMyClass", c("numeric",
"double", "integer", "MyClass")), which I believe should be the recommended
workaround here.
The underlying issue, though, is that I would not have expected *anything*
that I write to get in the way of Matrix; in fact, the classes that I
defined have nothing to do with Matrix at all. So, I have some fears that
this might be a bigger problem, possibly either in Methods or in Base.
1. Can others confirm that this is in fact an issue as I believe it to be?
2. If it is a legitimate issue, have others seen it manifested working with
other packages that are not Matrix? In this case, I believe that the class
union I defied is somehow interfering with the "index" class union in
Matrix, R/AllClass.R, line 809
3. Why should the class union I defined interfere with the inner workings
of a separate package?
4. Is this a bug in Base or Methods?
Thank you for your time!
Sincerely,
Ezra
Troubles using numeric in s4 class union
3 messages · Ezra Tucker, Martin Maechler, Michael Lawrence
15 days later
Ezra Tucker
on Mon, 11 Nov 2019 21:47:41 +0000 writes:
Hi all,
I came across an issue in using the Matrix package which made it that I
could only subset Matrices using the numeric class, but could not using
integers. Steps to reproduce the problem:
library(Matrix)
# this class has *nothing* to do with Matrix
setClass("MyClass",
representation(myvalue = "numeric"),
prototype(myvalue = NA_real_))
# this class also has nothing to do with Matrix
setClassUnion("NumOrMyClass", c("numeric", "MyClass"))
# this is to demonstrate creating and subsetting a specific Matrix
m <- new("dgCMatrix", i = c(2L, 0L, 1L, 2L, 0L, 1L), p = c(0L, 1L, 2L, 4L,
4L, 6L),
Dim = c(3L, 5L), Dimnames = list(NULL, NULL), x = c(2, 1, 2, 1, 2, 1),
factors = list())
# this next line fails:
m[1:2, 1:2]
The last line fails consistently with R 3.6.1 and Matrix 1.2-17 on a
variety of operating systems and computers (tested with ubuntu 19.10 &
windows 10). I'll note at this point that without the class union I defined
above, the rest of the code works perfectly fine.
There are 2 workarounds I've come up with. Firstly, one could change the
last line to
m[as.numeric(1:2), as.numeric(1:2)]
or as.numeric(seq()) or c(1, 2), etc.
The other workaround is to change setClassUnion("NumOrMyClass",
c("numeric", "MyClass")) to setClassUnion("NumOrMyClass", c("numeric",
"double", "integer", "MyClass")), which I believe should be the recommended
workaround here.
The underlying issue, though, is that I would not have expected *anything*
that I write to get in the way of Matrix; in fact, the classes that I
defined have nothing to do with Matrix at all. So, I have some fears that
this might be a bigger problem, possibly either in Methods or in Base.
1. Can others confirm that this is in fact an issue as I believe it to be?
yes, others have confirmed this is an issue .. (unfortunately not in this R-devel thread). Thank you, Ezra, very much for your helpful report, including a simple reproducible example.
2. If it is a legitimate issue, have others seen it manifested working with other packages that are not Matrix? In this case, I believe that the class union I defied is somehow interfering with the "index" class union in Matrix, R/AllClass.R, line 809
3. Why should the class union I defined interfere with the inner workings of a separate package?
There is no good reason ...
4. Is this a bug in Base or Methods?
This is a bug in "base R", in package 'methods'. The R core team had taken the issue up, already two weeks ago, but unfortunately did not get to address this in a definitive way. ==> I'll remind us about it ! Martin Maechler ETH Zurich and R Core
Thank you for your time! Sincerely, Ezra
I've been working on this and will hopefully get a fix checked in today. On Wed, Nov 27, 2019 at 3:53 AM Martin Maechler
<maechler at stat.math.ethz.ch> wrote:
Ezra Tucker
on Mon, 11 Nov 2019 21:47:41 +0000 writes:
Hi all,
I came across an issue in using the Matrix package which made it that I
could only subset Matrices using the numeric class, but could not using
integers. Steps to reproduce the problem:
library(Matrix)
# this class has *nothing* to do with Matrix
setClass("MyClass",
representation(myvalue = "numeric"),
prototype(myvalue = NA_real_))
# this class also has nothing to do with Matrix
setClassUnion("NumOrMyClass", c("numeric", "MyClass"))
# this is to demonstrate creating and subsetting a specific Matrix
m <- new("dgCMatrix", i = c(2L, 0L, 1L, 2L, 0L, 1L), p = c(0L, 1L, 2L, 4L,
4L, 6L),
Dim = c(3L, 5L), Dimnames = list(NULL, NULL), x = c(2, 1, 2, 1, 2, 1),
factors = list())
# this next line fails:
m[1:2, 1:2]
The last line fails consistently with R 3.6.1 and Matrix 1.2-17 on a
variety of operating systems and computers (tested with ubuntu 19.10 &
windows 10). I'll note at this point that without the class union I defined
above, the rest of the code works perfectly fine.
There are 2 workarounds I've come up with. Firstly, one could change the
last line to
m[as.numeric(1:2), as.numeric(1:2)]
or as.numeric(seq()) or c(1, 2), etc.
The other workaround is to change setClassUnion("NumOrMyClass",
c("numeric", "MyClass")) to setClassUnion("NumOrMyClass", c("numeric",
"double", "integer", "MyClass")), which I believe should be the recommended
workaround here.
The underlying issue, though, is that I would not have expected *anything*
that I write to get in the way of Matrix; in fact, the classes that I
defined have nothing to do with Matrix at all. So, I have some fears that
this might be a bigger problem, possibly either in Methods or in Base.
1. Can others confirm that this is in fact an issue as I believe it to be?
yes, others have confirmed this is an issue .. (unfortunately not in this R-devel thread). Thank you, Ezra, very much for your helpful report, including a simple reproducible example.
2. If it is a legitimate issue, have others seen it manifested working with other packages that are not Matrix? In this case, I believe that the class union I defied is somehow interfering with the "index" class union in Matrix, R/AllClass.R, line 809
3. Why should the class union I defined interfere with the inner workings of a separate package?
There is no good reason ...
4. Is this a bug in Base or Methods?
This is a bug in "base R", in package 'methods'. The R core team had taken the issue up, already two weeks ago, but unfortunately did not get to address this in a definitive way. ==> I'll remind us about it ! Martin Maechler ETH Zurich and R Core
Thank you for your time! Sincerely, Ezra
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Michael Lawrence Senior Scientist, Bioinformatics and Computational Biology Genentech, A Member of the Roche Group Office +1 (650) 225-7760 michafla at gene.com Join Genentech on LinkedIn | Twitter | Facebook | Instagram | YouTube