[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