2017-10-21 87 views
0

J'essaie donc de faire défiler des données et de les utiliser dans mon code. L'endroit où je besoin de cette chose essayer est à l'adresse suivante:Comment utiliser les instructions try dans R?

for (number in numbers) { 
    CTV_volume <- CTV[ which(CTV$Key==number), ]$volume 
    PTV_volume <- PTV[ which(PTV$Key==number), ]$volume 
    ITV_volume <- ITV[ which(ITV$Key==numbers), ]$volume 

    large_volume <- large_margin_vol_calc(radius_calc(CTV_volume), a_large, b_large) 
    small_volume <- small_margin_vol_calc(radius_calc(CTV_volume), a_small, b_small) 
} 

La chose est que le calcul CTV_volume dans les deux dernières lignes (large_volume et small_volume) dépend des données de la première ligne ci-dessus (CTV_volume). Cependant, pour chaque itération de la boucle, il y a une chance qu'il n'y ait pas de CTV pour cette clé/ce numéro particulier, et à la place j'ai besoin d'en utiliser une autre, c'est-à-dire ITV. Mais avant tout, j'en ai besoin pour utiliser le CTV en premier, si c'est le cas, sinon le mot ITV.

Comment cela est-il accompli dans R?

+0

C'est très facile. Essayez "si". En outre, puisque vous bouclez alors vous devez enregistrer vos valeurs dans une liste ou un vecteur. – Alice

+0

Mais puis-je utiliser si des instructions avec erreur? Par exemple, lorsque je lance le code et que je cours dans un endroit où le CTV n'existe pas, j'obtiens la valeur "numeric (0)" au lieu d'un nombre. Peut-on utiliser une instruction if sur une telle "valeur"? –

+0

vous pouvez tester la longueur d'un objet étant 0 – hrbrmstr

Répondre

1

Si vous obtenez un vecteur vide, c'est-à-dire numeric(0), cela ne constitue pas une erreur. Si vous utilisez tryCatch() comme indiqué ci-dessous, le résultat ne changera pas.

for (number in numbers) { 
    CTV_volume <- CTV[ which(CTV$Key==number), ]$volume 
    PTV_volume <- PTV[ which(PTV$Key==number), ]$volume 
    ITV_volume <- ITV[ which(ITV$Key==numbers), ]$volume 

    tryCatch({ 
    large_volume <- large_margin_vol_calc(radius_calc(CTV_volume), a_large, b_large) 
    small_volume <- small_margin_vol_calc(radius_calc(CTV_volume), a_small, b_small) 
    }, 
    error = function(e) { 
     #what should be done in case of exeption? 
     str(e) # prints structure of exeption 
     large_volume <- large_margin_vol_calc(radius_calc(ITV_volume), a_large, b_large) 
     small_volume <- small_margin_vol_calc(radius_calc(ITV_volume), a_small, b_small) 
    } 
) 
} 

Au lieu de cela ce que vous voulez sans doute faire est de vérifier si CTV_volume a la durée prévue.

for (number in numbers) { 
    CTV_volume <- CTV[ which(CTV$Key==number), ]$volume 
    PTV_volume <- PTV[ which(PTV$Key==number), ]$volume 
    ITV_volume <- ITV[ which(ITV$Key==numbers), ]$volume 

    if (length(CTV_volume) > 0) { 
    large_volume <- large_margin_vol_calc(radius_calc(CTV_volume), a_large, b_large) 
    small_volume <- small_margin_vol_calc(radius_calc(CTV_volume), a_small, b_small) 
    } else { 
    large_volume <- large_margin_vol_calc(radius_calc(ITV_volume), a_large, b_large) 
    small_volume <- small_margin_vol_calc(radius_calc(ITV_volume), a_small, b_small) 
    } 
}