使用tryCatch将用户定义函数的输出追加到列表中,并将警告/错误消息追加到R中的向量中

q3qa4bjr  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(96)

假设我有一个空向量和空列表-

ot_vec = c()
msg_lst = list()

字符串
此外,假设我有许多用户定义函数。现在我想使用一个tryCatch将Null列表中的自定义函数的输出和Null向量中的tryCatch的消息逐个追加,而不打印tryCatch的输出和消息。
例如,如果我使用tryCatch为Square_CalculatorSquareRoot_Calculator定义了两个用户定义函数,在运行以下代码行后,不应在此处直接给出输出或错误消息-
x1c 0d1x的数据
输出和错误或警告消息应附加在空列表和空向量中,即该列表和向量现在应采用以下形式-

我也在尝试-

虽然它将输出和错误消息附加到函数中的ot_listmsg_vec,但它并没有附加到我们在一开始创建的原始Null List和Null Vector。

djmepvbi

djmepvbi1#

我认为以下方法可行。向量化可能是可能的,但我将使用一个循环来处理tryCatch。此外,它的设置允许list作为输入,因为列表中可以有不同的数据类型。该示例将用于平方根,它在非数字时返回错误,在负数时返回警告。它将附加到传递的列表/向量。

squareRoot <- function(x, ot, msg) {
  for (i in seq_along(x)) {
    xsq <- tryCatch(sqrt(x[[i]]),
                    error = function(cond) simpleError(trimws(cond$message)),
                    warning = function(cond) simpleWarning(trimws(cond$message))
    )
    
    if (inherits(xsq, "simpleError")) {
      ot <- c(ot, list(NA_real_))
      msg <- c(msg, "Error Detected")
    } else if (inherits(xsq, "simpleWarning")) {
      ot <- c(ot, list(NA_real_))
      msg <- c(msg, "Warning Detected")
    } else {
      ot <- c(ot, list(xsq))
      msg <- c(msg, "Run Successfully")
    }
  }
  
  list(ot = ot, msg = msg)
}

字符串
现在测试:

x <- list(5, "5", -5, "-5", "Test")
y <- list("A", 36, 81, NA_real_)

Out <- squareRoot(x, list(), c())

Out
$ot
$ot[[1]]
[1] 2.236068

$ot[[2]]
[1] NA

$ot[[3]]
[1] NA

$ot[[4]]
[1] NA

$ot[[5]]
[1] NA

$msg
[1] "Run Successfully" "Error Detected"   "Warning Detected" "Error Detected"  
[5] "Error Detected"

Out <- squareRoot(y, Out$ot, Out$msg)

Out
$ot
$ot[[1]]
[1] 2.236068

$ot[[2]]
[1] NA

$ot[[3]]
[1] NA

$ot[[4]]
[1] NA

$ot[[5]]
[1] NA

$ot[[6]]
[1] NA

$ot[[7]]
[1] 6

$ot[[8]]
[1] 9

$ot[[9]]
[1] NA

$msg
[1] "Run Successfully" "Error Detected"   "Warning Detected" "Error Detected"  
[5] "Error Detected"   "Error Detected"   "Run Successfully" "Run Successfully"
[9] "Run Successfully"

相关问题