purrr::可能函数可能不使用map2_chr函数

purrr::可能函数可能不使用map2_chr函数,r,purrr,R,Purrr,我怀疑这是purrr包中的一个bug,但我想先检查一下StackOverflow中的逻辑 在我看来,可能函数在map2\u chr函数中不起作用。我使用的是purrr版本0.2.5 考虑这个例子: library(dplyr) library(purrr) lets <- tibble(posn = 2:0, lets_list = list(letters[1:5], letters[1:5], letters[1:5])) %>% glimp

我怀疑这是purrr包中的一个bug,但我想先检查一下StackOverflow中的逻辑

在我看来,
可能
函数在
map2\u chr
函数中不起作用。我使用的是purrr版本0.2.5

考虑这个例子:

library(dplyr)
library(purrr)

lets <- tibble(posn = 2:0,
               lets_list = list(letters[1:5], letters[1:5], letters[1:5])) %>% 
  glimpse()
失败并显示此错误消息,因为第三行的posn=0

> lets %>% 
+   mutate(lets_sel = map2_chr(lets_list, posn, ~.x[.y]))
#    Error in mutate_impl(.data, dots) : 
#      Evaluation error: Result 3 is not a length 1 atomic vector.
函数与
map2\u chr
一起使用也可能会返回错误

lets %>% 
  mutate(lets_sel = map2_chr(lets_list, posn, possibly(~.x[.y], NA_character_)))
# Error in mutate_impl(.data, dots) : 
#  Evaluation error: Result 3 is not a length 1 atomic vector.
但是,
map2
功能工作正常:

> lets %>% 
+   mutate(lets_sel = map2(lets_list, posn, possibly(~.x[.y], NA_character_)))
# A tibble: 3 x 3
   posn lets_list lets_sel 
  <int> <list>    <list>   
1     2 <chr [5]> <chr [1]>
2     1 <chr [5]> <chr [1]>
3     0 <chr [5]> <chr [0]>
>让%>%
+变异(let_sel=map2(let_list,posn,可能是(~.x[.y],NA_字符)))
#一个tibble:3x3
posn lets_list lets_sel
1     2  
2     1  
3     0  
一个解决方案是使用map2,然后使用map_chr,但我怀疑这是一个bug

> lets %>% 
+   mutate(lets_sel = map2(lets_list, posn, ~.x[.y]),
+          lets_sel = map_chr(lets_sel, possibly(~.x[1], NA_character_)))
    # A tibble: 3 x 3
       posn lets_list lets_sel
      <int> <list>    <chr>   
    1     2 <chr [5]> b       
    2     1 <chr [5]> a       
    3     0 <chr [5]> NA      
>让%>%
+突变(let_sel=map2(let_list,posn,~.x[.y]),
+lets_sel=map_chr(lets_sel,可能是(~.x[1],NA_字符)))
#一个tibble:3x3
posn lets_list lets_sel
1.2 b
21 a
30NA
我是不是遗漏了什么?
谢谢。

好的,现在我认为这只是一个“功能”。最优雅的解决方案/解决方案是:

lets %>% 
  mutate(lets_sel = map2(lets_list, posn, ~.x[.y]) %>% 
           map_chr(., possibly(~.x[1], NA_character_)))
“帮助”屏幕中没有任何地方表明可以安全且可能地与
map2
函数系列一起使用。因此,我认为这是一个“特性”而不是一个“缺陷”。
谢谢

可能()
不起作用,因为使用
0
进行索引不会引发错误; 它只返回长度为0的向量:

n个字母字符(0)
第n个字母(0)
#>字符(0)
在这种情况下,用
NA
(使用例如
dplyr::na_if()
,或者如果实际问题更复杂,则使用普通的老
ifelse
)来获得您想要的:

让%>%
突变(let_sel=map2_chr(let_list,na_if(posn,0),~.x[.y]))
#>#tibble:3 x 3
#>posn lets_list lets_sel
#>           
#>1.2 b
#>21 a
#> 3     0  

由(v0.2.0.9000)于2018-08-07创建。

刚刚意识到,在我的解决方案中,map2函数中可能不需要此选项,因此我更改了可复制的示例。我的问题仍然有效。谢谢
> lets %>% 
+   mutate(lets_sel = map2(lets_list, posn, ~.x[.y]),
+          lets_sel = map_chr(lets_sel, possibly(~.x[1], NA_character_)))
    # A tibble: 3 x 3
       posn lets_list lets_sel
      <int> <list>    <chr>   
    1     2 <chr [5]> b       
    2     1 <chr [5]> a       
    3     0 <chr [5]> NA      
lets %>% 
  mutate(lets_sel = map2(lets_list, posn, ~.x[.y]) %>% 
           map_chr(., possibly(~.x[1], NA_character_)))