【问题标题】:using purrr to catch errors with mapply使用 purrr 通过 mapply 捕获错误
【发布时间】:2018-05-04 15:29:36
【问题描述】:

我正在掌握 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>

【问题讨论】:

  • mapmap2pmap 类似于带有两个参数的 lapplymapply 和带有任意数量参数的 mapply。例如:map2(x.bad, y, safe_sum).
  • mapplySIMPLIFY = TRUE。您可以将其更改为SIMPLIFY = FALSE 或使用Map
  • 留在purrr 宇宙中而不是将其与基本R apply 混合可能是一个好主意。无论如何,输出是我所期望的:结果总是 NA 并且信息性消息存储在 error 中,而且它被简化为矩阵。

标签: r purrr mapply


【解决方案1】:

您的 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

今天出现了一个博客,其中包含一些更详细的示例。你可以找到它here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多