gpt4 book ai didi

R - 返回默认值的函数 - getOrElse

转载 作者:行者123 更新时间:2023-12-04 12:11:23 27 4
gpt4 key购买 nike

我正在尝试创建一个函数来计算一个表达式,如果该表达式的结果不是“有限的”(由 is.finite 定义),那么它将返回一个默认值。在抛出错误的情况下,该函数仍应返回默认值。该函数也应该被向量化。

这应该很简单,但我只是不完全理解 R 的错误捕获功能。有人可以帮助改进/简化此功能以满足这些测试用例吗?

这是我拥有的一个函数的开始。即使它能工作,它也相当丑陋。

getOrElse <- function (expr, default = 0) {

# protect against any errors
val <- tryCatch (expr, error = function (e) {})

# replace any non-finite values
val [!is.finite(val)] <- default

# this is really ugly
if (length(val) > 1 && !is.finite(val)) val <- default

return (val)
}

这里是“测试用例”...

getOrElse (sqrt(4), default = 10) == 2 # WORKS

getOrElse (stop ("ignore"), default = 10) == 10 # BROKEN

getOrElse (sqrt(c(4, 16, NA, NaN)), default = 0) == c(2, 4, 0, 0) # BROKEN

getOrElse (sqrt(c(4, 16)), default = 0) == c(2, 4) # WORKS

getOrElse (c(NA, NA), default = 10) == c(10, 10) # WORKS

非常感谢

最佳答案

当你得到一个错误时你并没有真正做任何事情,所以考虑这个修改:

getOrElse <- function (expr, default = 0) {
stopifnot(length(default) == 1)
val <- tryCatch (expr, error = function (e) {})
if( length(val) ){
val [!is.finite(val)] <- default
} else {
val <- default}

return (val)
}

它仍然会通过 getOrElse (sqrt(c(4, 16, NA, Nan)), default = 0) == c(2, 4, 0, 0) 测试失败,但是这是因为 Nan 不是 NaN 并且上面的代码将返回长度为 1 的“默认”值。如果您改为使用 getOrElse (sqrt(c(4, 16, NA, NaN)), default = 0) == c(2, 4, 0, 0) 进行测试,它将成功。如果您仍然需要在分别应用于函数的每个参数的表达式中返回函数,那么您将需要进行更复杂的解析。

关于R - 返回默认值的函数 - getOrElse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19865529/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com