[prev in list] [next in list] [prev in thread] [next in thread] 

List:       r-devel
Subject:    Re: [Rd] diag(-1) produces weird result
From:       Gábor Csárdi <csardi.gabor () gmail ! com>
Date:       2018-09-18 13:07:31
Message-ID: CABtg=Kn_kPTTwsmg1iRcrvDFm94FB32yXmTHAL38J1trj1_24Q () mail ! gmail ! com
[Download RAW message or body]

Some languages that recognized early design mistakes introduced a
strict mode, which applies to a local context, and enforces a safer,
more consistent API. This is a pragmatic solution, as it does not
require any changes to existing code, but still allows writing better
code in the future.

Implementing a context restricted strict mode is probably not trivial,
considering the flexibility of the language, but maybe it is worth
some thinking.

Gábor
On Tue, Sep 18, 2018 at 2:00 PM peter dalgaard <pdalgd@gmail.com> wrote:
> 
> Yes, both are rooted in age-old design infelicities (in which, basically, \
> interactive expedience has taken precedence over consistency and generality). 
> Unfortunately, they are quite difficult to rectify, because there are bound to be \
> countless uses of, say, diag(5) as a 5x5 identity matrix which would break if it \
> suddenly meant the 1x1 matrix(5) instead. 
> We'd need a very carefully orchestrated warn-deprecate-defunct-newBehaviour \
> sequence, with a time scale of years, most likely. It is, in principle, doable (I \
> think), but we don't really have the mechanisms to follow through on it.  Almost \
> all developers have main job responsibilities, and it is very easy to get \
> sidetracked at the wrong moment, so most changes get done on a now-or-never basis. 
> I have toyed with the idea of setting up for version-dependent code where code \
> sections could be coded up front and then activated when the relevant version is \
> reached. Then I got swamped again... 
> -pd
> 
> > On 17 Sep 2018, at 20:08 , Barry Rowlingson <b.rowlingson@lancaster.ac.uk> wrote:
> > 
> > On Mon, Sep 17, 2018 at 5:22 PM, Gábor Csárdi <csardi.gabor@gmail.com>
> > wrote:
> > 
> > > 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
> > > > 
> > > 
> > 
> > Anyone else getting deja-vu with the `sample` function?
> > 
> > > sample(5:3)
> > [1] 3 5 4
> > 
> > ok...
> > 
> > > sample(5:4)
> > [1] 4 5
> > 
> > fine...
> > 
> > > sample(5:5)
> > [1] 3 1 5 2 4
> > 
> > uh oh. Documented, of course.
> > 
> > B
> > 
> > [[alternative HTML version deleted]]
> > 
> > ______________________________________________
> > R-devel@r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel
> 
> --
> Peter Dalgaard, Professor,
> Center for Statistics, Copenhagen Business School
> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> Phone: (+45)38153501
> Office: A 4.23
> Email: pd.mes@cbs.dk  Priv: PDalgd@gmail.com
> 
> 
> 
> 
> 
> 
> 
> 
> 

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic