Problema no laço while e componentes de um vector

MatrizCorrelação<-array(c(1,0.9,0.7,0.9,1,0.3,0.7,0.3,1),dim=c(3,3)) EigenMC<-eigen(MatrizCorrelação) EigenMC$values [1] 2.296727793 0.710624647 -0.007352439
NovaMatrizCorrelação<-MatrizCorrelação NovoEigenMC<-eigen(NovaMatrizCorrelação) int<-0
while(NovoEigenMC$values<0){
Boa noite, Estou com um problema que eu acho que deve ser super simples mas não estou conseguindo resolver: + + int<-int + 1 + + NovoEigenMC.<-ifelse(NovoEigenMC$values<0, 0, NovoEigenMC$values) + + NovaMatrizCorrelação<-NovoEigenMC$vectors %*% diag(NovoEigenMC.) %*% t(NovoEigenMC$vectors) + + NovaMatrizCorrelação<- NovaMatrizCorrelação/sqrt(diag(NovaMatrizCorrelação) %*% t(diag(NovaMatrizCorrelação))) + + eigen(NovaMatrizCorrelação)$values + int + } Mensagens de aviso perdidas: In while (NovoEigenMC$values < 0) { : a condição tem comprimento > 1 e somente o primeiro elemento será usado Eu pensei em colocar um for e fazer desta forma: MatrizCorrelação<-array(c(1,0.9,0.7,0.9,1,0.3,0.7,0.3,1),dim=c(3,3)) EigenMC<-eigen(MatrizCorrelação) EigenMC$values NovaMatrizCorrelação<-MatrizCorrelação NovoEigenMC<-eigen(NovaMatrizCorrelação) int<-0 for(i in 1:3){ while(NovoEigenMC$values[i]<0){ int<-int + 1 NovoEigenMC.<-ifelse(NovoEigenMC$values<0, 0, NovoEigenMC$values) NovaMatrizCorrelação<-NovoEigenMC$vectors %*% diag(NovoEigenMC.) %*% t(NovoEigenMC$vectors) NovaMatrizCorrelação<- NovaMatrizCorrelação/sqrt(diag(NovaMatrizCorrelação) %*% t(diag(NovaMatrizCorrelação))) eigen(NovaMatrizCorrelação)$values int } } Mas por algum motivo o programa fica rodando rodando e rodando e nada. Muito obrigada, Michelle

Michelle, bom dia! O objeto NovoEigenMC$values é um vetor de 3 elementos, portanto "a condição tem comprimento > 1 e somente o primeiro elemento será usado". Imagino que a condição que você queira testar é se há pelo menos um valor negativo no vetor. Se for isso, sua condição para while poderia ser: ### enquanto a cond1 > 0, existe ao menos um valor negativo cond1 <- sum(NovoEigenMC$values<0) while(cond1 > 0) ou ### enquanto cond2 == FALSE, há pelo menos um negativo cond2 <- all(NovoEigenMC$values>0) while(cond2 == FALSE) Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]

Era isso mesmo Éder! Muuuito obrigada! Em 23 de abril de 2015 09:04, Éder Comunello <comunello.eder@gmail.com> escreveu:
Michelle, bom dia!
O objeto NovoEigenMC$values é um vetor de 3 elementos, portanto "a condição tem comprimento > 1 e somente o primeiro elemento será usado".
Imagino que a condição que você queira testar é se há pelo menos um valor negativo no vetor. Se for isso, sua condição para while poderia ser:
### enquanto a cond1 > 0, existe ao menos um valor negativo cond1 <- sum(NovoEigenMC$values<0) while(cond1 > 0)
ou
### enquanto cond2 == FALSE, há pelo menos um negativo cond2 <- all(NovoEigenMC$values>0) while(cond2 == FALSE)
Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Olá, Michelle! Outro ponto que reparei é que sei código manipula um objeto NovoEigenMC. (com ponto no final) e você testa a condição para o objeto NovoEigenMC (sem ponto). Como o objeto da condição não é alterado vai cair num loop infinito (sempre mesmo valor). E pra que seria o objeto int?. Éder Comunello <c <comunello.eder@gmail.com>omunello.eder@gmail.com> Dourados, MS - [22 16.5'S, 54 49'W]
participantes (2)
-
Michelle Bau Graczyk
-
Éder Comunello