如果 purrr:possible() 内部的表达式失败,则返回映射对象

ohn*_*lus 3 error-handling r purrr

我有一个数据框,其中一列包含更多数据框。其中一个数据框缺少一列。我想从其他两个数据框中删除该列(如果存在)。

\n\n

这是一个例子:

\n\n
library(tidyverse)\n\nmtcars %>%\ngroup_by(cyl) %>%\nnest -> tmp\ntmp[3,'data'][[1]][[1]] <- dplyr::select(tmp[3,'data'][[1]][[1]], -mpg)\n\nprint(tmp)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
# A tibble: 3 x 2\n    cyl data              \n  <dbl> <list>            \n1    6. <tibble [7 \xc3\x97 10]> \n2    4. <tibble [11 \xc3\x97 10]>\n3    8. <tibble [14 \xc3\x97 9]>\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

因此,在这里,该data列包含三个小标题,其中最后一个不包含该列mpg。我可以在数据列上映射 dplyr::select ,并通过返回捕获错误NA如下所示:

\n\n
 tmp %>% mutate(data2 = map(data, possibly(~dplyr::select(.,-mpg), otherwise = NA)))\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
# A tibble: 3 x 3\n    cyl data               data2            \n  <dbl> <list>             <list>           \n1    6. <tibble [7 \xc3\x97 10]>  <tibble [7 \xc3\x97 9]> \n2    4. <tibble [11 \xc3\x97 10]> <tibble [11 \xc3\x97 9]>\n3    8. <tibble [14 \xc3\x97 9]>  <lgl [1]>\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

但我真正想做的是返回输入数据。就像是:

\n\n
 tmp %>% mutate(data2 = map(data, possibly(~dplyr::select(.,-mpg), otherwise = function(x){x})))\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n
# A tibble: 3 x 3\n    cyl data               data2            \n  <dbl> <list>             <list>           \n1    6. <tibble [7 \xc3\x97 10]>  <tibble [7 \xc3\x97 9]> \n2    4. <tibble [11 \xc3\x97 10]> <tibble [11 \xc3\x97 9]>\n3    8. <tibble [14 \xc3\x97 9]>  <fn>\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

但当然,这只是function(x){x}作为 的最后一行返回data2

\n\n

有什么巧妙的想法吗?或者在这种情况下我只需要tryCatch更明确地使用或以其他方式处理错误?

\n

Psi*_*dom 5

otherwisein 中的参数是possibly一个常量,因此它不会随着被包装函数的输入而改变;您可能要做的就是包装possibly另一个可以访问元素的函数data,将元素设置为otherwise

\n\n
my_select <- function(x) {\n    f = possibly(function() select(x, -mpg), otherwise = x)\n    f()\n}\n\ntmp %>% mutate(data2 = map(data, my_select))\n# A tibble: 3 x 3\n#    cyl data               data2            \n#  <dbl> <list>             <list>           \n#1  6.00 <tibble [7 x 10]>  <tibble [7 x 9]> \n#2  4.00 <tibble [11 x 10]> <tibble [11 x 9]>\n#3  8.00 <tibble [14 x 9]>  <tibble [14 x 9]>\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者采用公式形式:

\n\n
tmp %>% \n    mutate(data2 = map(data, ~ (invoke(possibly(function() select(.,-mpg), otherwise = .)))))\n\n# A tibble: 3 x 3\n#    cyl data               data2            \n#  <dbl> <list>             <list>           \n#1     6 <tibble [7 \xc3\x97 10]>  <tibble [7 \xc3\x97 9]> \n#2     4 <tibble [11 \xc3\x97 10]> <tibble [11 \xc3\x97 9]>\n#3     8 <tibble [14 \xc3\x97 9]>  <tibble [14 \xc3\x97 9]>\n
Run Code Online (Sandbox Code Playgroud)\n