以矢量化方式处理Trycatch错误

时间:2016-09-29 03:11:14

标签: r try-catch vectorization

我正在计算一个人根据期限,月付款和原始本金获得的贷款利率。例如,一个人可能有120个月的期限,每月支付200美元的贷款,原始本金为10000美元。

我正在使用包RATE中的optiRum函数。在上面的示例中,利率为RATE(120, -200, 10000) = 0.0175(这是每月利率)

现在,有些情况下利率计算失败。例如,在term*monthly_payment < original_principal的情况下,您无法计算费率。例如,RATE(3, -200, 1000)会正确抛出错误rate > 0 is not TRUE

对于RATE引发错误的行,我需要tryCatch来存储错误消息,否则它应该计算速率。不幸的是,tryCatch的行为是输入所有行的错误消息。请参阅以下案例以获取示例。

案例1:

在下面的代码中,我有3个贷款,期限为6,每月支付200,起始本金为1000.所有3个记录的利率应为0.05472。

library(optiRum)
tryCatch(RATE(c(6,6,6), c(-200, -200, -200), c(1000, 1000, 1000)),
        error = function(e) "error")

输出[1] 0.05472 0.05472 0.05472

案例2:

在下面的代码中,我有2条记录,第6条记录和1条记录,第1条记录。所有记录的每月付款为200,起始本金为1000. 2条记录的利率应为0.05472,对于最后一个它应该只存储一条错误信息。

tryCatch(RATE(c(6,6,1), c(-200, -200, -200), c(1000, 1000, 1000)),
        error = function(e) "error") 

输出[1] "error"

预期输出为"0.05472", "0.05472", "error",与实际输出不匹配。

我有一个在循环场景中应用tryCatch的解决方案,但在处理数百万行时,此解决方案不可行。如果有人能告诉我如何对tryCatch行为进行矢量化,将会非常有帮助。

Loopy循环tryCatch:

rate_catch <- function (terms_duration, monthly_payment_amount, original_amount) {
  return(tryCatch(RATE(terms_duration, monthly_payment_amount, original_amount), error=function(e) NA))
}

for (i in 1:nrow(df)) {
  df[i,4]<-rate_catch(df$terms_duration[i],
             -df$monthly_payment_amount[i],
             df$original_amount[i])
}

0 个答案:

没有答案