Skip to content

diag(-1) produces weird result

4 messages · William Revelle, Duncan Murdoch, Gábor Csárdi +1 more

#
Dear list

A strange bug in the psych package is due to the behavior of the diag function:

It gives the expected values for 1, a vector (-1,1), but not for -1

Is this a known feature?
[,1]
[1,]    1
[,1] [,2]
[1,]   -1    0
[2,]    0    1
Error in diag(-1) : invalid 'nrow' value (< 0)


Bill


William Revelle		   personality-project.org/revelle.html
Professor			          personality-project.org
Department of Psychology www.wcas.northwestern.edu/psych/
Northwestern University	   www.northwestern.edu/
Use R for psychology         personality-project.org/r
It is 2   minutes to midnight   www.thebulletin.org
#
On 17/09/2018 12:14 PM, William Revelle wrote:
It is pretty clearly documented:

"diag has four distinct usages:

...

3.  x is a scalar (length-one vector) and the only argument, it returns 
a square identity matrix of size given by the scalar."

Duncan Murdoch
#
I would say it is a mis-feature. If the 'x' argument of diag() is a
vector of length 1, then it creates an identity matrix of that size,
instead of creating a 1x1 matrix with the given value:

? diag(3)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

Of course this makes it cumbersome to use diag() in a package, when
you are not sure if the input vector is longer than 1. This seems to
be a good workaround:

? diag(-1, nrow = 1)
     [,1]
[1,]   -1

Or, in general if you have vector v:

? v <- -1
? diag(v, nrow = length(v))
     [,1]
[1,]   -1

Gabor
On Mon, Sep 17, 2018 at 5:14 PM William Revelle <lists at revelle.net> wrote:
#
It behaves as per documentation.


" Using diag(x) can have unexpected effects if x is a vector that could be of length one. Use diag(x, nrow = length(x)) for consistent behavior."


Ravi