r - 使用 purrr 通过 mapply 捕获错误
问题描述
我开始掌握包purrr
以及如何使用它来捕获代码问题。当它与mapply
. 下面我概述了一个工作示例,这是实现代码的正确方法吗?
x.good <- c(2, 2, 3, 3)
x.bad <- c(2, 2, "A", 3)
y <- c(2, 2, 3, 3)
mapply(sum, x.good, y) # works just fine
mapply(sum, x.bad, y) # understandably makes R unhappy
# Define a new function
library(purrr)
safe_sum <- safely(sum, otherwise=NA_real_)
# apply it
res <- mapply(safe_sum, x.bad, y)
res
2 2 A 3
result NA NA NA NA
error List,2 List,2 List,2 List,2
在教程map
中也用到了这个功能,这里也需要这个吗?
更新
运行map2
似乎只返回错误?
map2(x.bad, y, safe_sum)
[[1]]
[[1]]$result
[1] NA
[[1]]$error
<simpleError in sum(..., na.rm = na.rm): invalid 'type' (character) of argument>
[[2]]
[[2]]$result
[1] NA
[[2]]$error
<simpleError in sum(..., na.rm = na.rm): invalid 'type' (character) of argument>
[[3]]
[[3]]$result
[1] NA
[[3]]$error
<simpleError in sum(..., na.rm = na.rm): invalid 'type' (character) of argument>
[[4]]
[[4]]$result
[1] NA
[[4]]$error
<simpleError in sum(..., na.rm = na.rm): invalid 'type' (character) of argument>
解决方案
你的 x.bad 是一个字符向量。这就是这个例子中的问题。如果您将 x.bad 更改为安全示例中的列表,它将起作用,因为只有“A”将被定义为字符,其余的将是数字。
x.bad <- list(2, 2, "A", 3)
y <- c(2, 2, 3, 3)
library(purrr)
safe_sum <- safely(sum, otherwise=NA_real_)
map2(x.bad, y, safe_sum)
[[1]]
[[1]]$result
[1] 4
[[1]]$error
NULL
[[2]]
[[2]]$result
[1] 4
[[2]]$error
NULL
[[3]]
[[3]]$result
[1] NA
[[3]]$error
<simpleError in sum(..., na.rm = na.rm): invalid 'type' (character) of argument>
[[4]]
[[4]]$result
[1] 6
[[4]]$error
NULL
今天出现了一个博客,其中包含更详细的示例。你可以在这里找到它。
推荐阅读
- google-cloud-platform - 如何检查 GTM 事件触发器发送到 Recommendations AI 项目的信息?
- python - 为什么我在绘制 FRR 和 FAR 图时出现连续错误
- python - 是否可以在命令式映射 SQLAlchemy 中定义 hybrid_property?
- performance - 如何获取 Azure Function 步骤的执行时间?
- html - 文本和按钮在一行中的绝对定位
- objective-c - 具体指数开盘通知
- wordpress-theming - WordPress主题检查
- javascript - 提供跨类似 React 组件的通用 props 接口
- node.js - 我应该从后端或客户端应用程序向 Elasticsearch 调用搜索查询吗?
- scala - 如何根据火花数据框中的值的累积总和为每一行分配一个类别?