[R] write.matrix.csr(e1071) bug
David Meyer
david.meyer at wu-wien.ac.at
Fri Oct 24 12:38:11 CEST 2008
Peter:
Yes, this is a bug. The line
if (x at ia[i] <= nrow(x))
should actually read
if ((x at ia[i] <= length(x at ra)) && (x at ia[i] < x at ia[i + 1]))
--> fixed upstream.
Thanks
David
--------
Hello,
The write.matrix.csr() function of the e1071 package contains a bug.
Try the following:
library(e1071)
m <- 1 - diag(10)
sm <- as.matrix.csr(m)
write.matrix.csr(sm)
The resulting file (out.dat) contains only the two lines below:
2:1 3:1 4:1 5:1 6:1 7:1 8:1 9:1 10:1
1:1 3:1 4:1 5:1 6:1 7:1 8:1 9:1 10:1
This is obviously wrong as the matrix m has 90 non-zero entries.
The function is implemented as
write.matrix.csr <- function (x, file="out.dat", y=NULL) {
on.exit(sink())
if(!require("methods")) stop("Could not load package 'methods'.")
if (!is.null(y) & (length(y) != nrow(x)))
stop(paste("Length of y (=", length(y),
") does not match number of rows of x (=",
nrow(x), ")!", sep=""))
sink(file)
for (i in 1:nrow(x)) {
if (!is.null(y)) cat (y[i],"")
if (x at ia[i] <= nrow(x))
for (j in x at ia[i]:(x at ia[i+1] - 1))
cat(x at ja[j], ":", x at ra[j], " ", sep="")
cat("\n")
}
}
The bug is caused by the line
if (x at ia[i] <= nrow(x))
that is completely meaningless. In the above example nrow(x) is 10
and x at ia is the vector
1 10 19 28 37 46 55 64 73 82 91
Entries of x at ia has nothing to do with the number of rows in the matrix.
To fix the bug this line must be removed.
Best regards,
More information about the R-help
mailing list