On 07/01/2010 9:31 AM, bergarog at gmail.com wrote:> Dear all
> I have the following problem.
>
> M <- matrix(0,3,3) # dimension of M is dinamic and this can lead to the
> next subscript
>
> diag(M[1,1]) <- rep(100,1)
> #Error in `diag<-`(`*tmp*`, value = 100) :
> # only matrix diagonals can be replaced
>
> diag(M[1,1,drop=F]) <- rep(100,1)
> #Error in diag(M[1, 1, drop = F]) <- rep(100, 1) :
> # incorrect number of subscripts
>
> diag(M[2:3,1:2]) <- rep(100,2)
> # works fine
>
> Is there a way to usw diag as replacement function when the input matrix is
> subscript to a one by one matrix. I don't want extra if(dim==1)... etc.
>
The problem isn't with diag, it's with "[<-". When you
include drop=F,
it doesn't appear to handle properly the matrix indexing that diag() uses.
So a simpler example is just
M[1,1, drop=FALSE] <- 1
which generates the same error you saw. I'd call this a bug; I'll look
into it. ("[<-" is done internally in some fairly ugly code, so
this
might take a while.)
As a workaround, I think this does what you want:
n <- 1
submatrix <- M[1:n,1:n,drop=FALSE]
diag(submatrix) <- rep(100, n)
M[1:n,1:n] <- submatrix
Duncan Murdoch
> Thanks a lot in advance.
> Best regards,
> Roger
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>