Comment ignorer une erreur dans une boucle
Je veux passer un message d'erreur (si elles existent) dans une boucle et continuer à la prochaine itération. Je veux calculer 100 inverse des matrices de un 2 par 2 de la matrice avec des éléments choisis au hasard à partir de {0, 1, 2}. Il est possible d'avoir une matrice singulière (par exemple,
1 0
2 0
Voici mon code
set.seed(1)
count <- 1
inverses <- vector(mode = "list", 100)
repeat {
x <- matrix(sample(0:2, 4, replace = T), 2, 2)
inverses[[count]] <- solve(x)
count <- count + 1
if (count > 100) break
}
À la troisième itération, la matrice est singulière et le code s'arrête avec un message d'erreur. Dans la pratique, je voudrais d'ignorer cette erreur et de continuer à la prochaine boucle. Je sais que j'ai besoin d'utiliser un try
ou tryCatch
fonction mais je ne sais pas comment les utiliser. Des questions similaires ont été posées ici, mais ils sont tous vraiment compliqué, et les réponses sont bien au-delà de ma compréhension. Si quelqu'un peut me donner un code complet spécifiquement pour cette question, je l'apprécie vraiment.
Vous devez vous connecter pour publier un commentaire.
Ce serait
NULL
s eninverses
pour le singulier matrices:Si la première expression dans un appel à
tryCatch
génère une erreur, il s'exécute et renvoie la valeur de la fonction fourni à seserror
argument. La fonction fournie à l'error
arg doit prendre l'erreur elle-même comme un argument (ici je l'appellee
), mais vous n'avez pas à faire quelque chose avec elle.Vous pouvez ensuite déposer la
NULL
entrées avecinverses[! is.null(inverses)]
.Sinon, vous pouvez utiliser le niveau inférieur
try
. Le choix est vraiment une question de goût.Si votre expression génère une erreur,
try
renvoie un objet de classetry-error
. Il affiche le message à l'écran sisilent=FALSE
. Dans ce cas, six.inv
a classetry-error
, nous appelonsnext
pour arrêter l'exécution de l'itération en cours et passer à la suivante, autrement nous ajouterx.inv
àinverses
.Edit:
Vous pourriez éviter d'utiliser le
repeat
boucle avecreplicate
etlapply
.Il est intéressant de noter que le deuxième argument de
replicate
est traité comme unexpression
, sens, il est exécuté à nouveau pour chaque répétition. Cela signifie que vous pouvez utiliserreplicate
de faire unlist
de n'importe quel nombre d'objets aléatoires sont générés à partir de la même expression.Au lieu d'utiliser
tryCatch
, il vous suffit de calculer le déterminant de la matrice avec la fonctiondet
. Une matrice est inversible si et seulement si le déterminant est nul.Par conséquent, vous pouvez tester si le déterminant est différent de zéro et calculer l'inverse que si le test est positif:
Mise à jour:
Il est, cependant, possible d'éviter de générer de singulières de matrices. Le déterminant d'une 2-par-2 matrice
mat
est défini commemat[1] * mat[4] - mat[3] * mat[2]
. Vous pouvez utiliser cette connaissance pour l'échantillonnage aléatoire des nombres. Il suffit de ne pas le nombre d'échantillons qui va produire une matrice singulière. Bien entendu, cela dépend du nombre échantillonné avant.Cette procédure est de garantir que toutes les matrices générées auront l'inverse.
A <- diag(rep(0.000000000001,1000)) det(A)
. Mais A est inversible.solve
me donne des messages d'erreur. Il n'est pas possible de suivre votre mise à jour pour obtenir une matrice non singulière.A
est une matrice non singulière, mais en raison de l'arrondissement des problèmes engendrés par les petits nombres, la fonctiondet(A)
renvoie zéro. Si vous avez un coup d'oeil àdeterminant(A)
, vous verrez le (journal) déterminant est différent de zéro. Par conséquent, un meilleur test quedet(A) == 0
seraitis.finite(determinant(A)$modulus)
.try
est juste une façon de direR
: "Si vous commettez une erreur à l'intérieur de la suite de parenthèses, puis de sauter et de se déplacer."Donc, si vous êtes inquiet que
x <- matrix(sample(0:2, 4, replace = T), 2, 2)
vous donnera peut-être une erreur, alors tout ce que vous avez à faire est de:Cependant, gardez à l'esprit, alors que
x
sera pas défini si vous le faire et il finit par ne pas être en mesure de calculer la réponse. Que pourrait provoquer un problème lorsque vous arrivez àsolve(x)
- de sorte que vous pouvez définirx
avanttry
ou tout simplement "d'essayer" de toute chose:x
hors de l'appel àtry
, comme dans:x <- try(matrix(.etc.))
Puis testezx
's de la classeLa documentation pour essayer explique votre problème plutôt bien. Je vous suggère d'aller à travers elle complètement.
Edit:
La documentation exemple l'air très simple et très similaires à la discussion de la question. Merci pour la suggestion mais. Voici la réponse en suivant l'exemple dans la page de documentation:try
sans répondre à sa question