2017-10-21 134 views
0

所以我想循環一些數據並在我的代碼中使用它們。在這裏我需要這個東西試試看的位置是在以下幾點:如何在R中使用try語句?

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) 
} 

的事情是CTV_volume計算在最後兩行(large_volumesmall_volume)取決於數據從第一線以上(CTV_volume)。但是,對於循環的每一次迭代,都有可能沒有該特定鍵/數字的CTV,而是需要使用另一個,即ITV。但首先我需要它首先使用CTV,如果不存在的話,那麼ITV詞。

這是如何在R中完成的?

+0

這很容易。嘗試「如果」。此外,由於你循環,你需要將你的值保存在列表或向量中。 – Alice

+0

但是我可以使用if語句有錯誤嗎?例如,當我運行代碼並運行到CTV不存在的地方時,我會得到「value」數值(0)而不是數字。人們可以在這樣的「價值」上使用if語句嗎? –

+0

你可以測試一個對象的長度爲0 – hrbrmstr

回答

1

如果你找回空載體,即numeric(0)它在技術上不是一個錯誤。

因此,如果您使用tryCatch()如下所示,結果將不會改變。

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) 
    } 
) 
} 

相反,你可能想要做的是檢查是否有CTV_volume期望的長度。

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) 
    } 
}