首页 文章

如何调用使用magrittr管道创建的对象的元素?

提问于
浏览
0

使用magrittr piper运算符,我们对向量执行操作 .

strings <- "a b c"
strings %>% strsplit(" ") # Here we get a list 


> strings %>% strsplit(" ")
[[1]]
[1] "a" "b" "c"

但是我们假设我们只想得到这个列表中的单个元素 . 这需要我们(例如获得第一个元素):

(strings %>% strsplit(" "))[[1]][1] # Notice the braces around the expression..

现在我的问题是:有没有办法使用管道操作符而不需要将整个表达式放在括号中?我认为,如果我们不必将其写入临时变量或使用括号但使用某种特殊的管道运算符,那将更加透明 .

还有另一种方法吗?

5 回答

  • 0

    或者:

    strings %>% strsplit(" ") %>% { .[[1]][1] }

    这将是相同的

    strings %>% strsplit(" ") %>% .[[1]] %>% .[1]

    比较时间:

    library(purrr)
    library(dplyr)
    microbenchmark::microbenchmark(
      (strings %>% strsplit(" ") %>%  unlist %>%  first)
      ,(strings %>%  strsplit(" ") %>% { .[[1]][1] })
      ,(strings %>% strsplit(" ") %>% map_chr(1))
    )
    # Unit: microseconds
    #                                          expr     min      lq       mean     median       uq      max    neval
    # (strings %>% strsplit(" ") %>% unlist %>% first)   280.270 288.363  301.9581 295.4685 305.1395  442.511   100
    # (strings %>% strsplit(" ") %>% {     .[[1]][1] })  211.980 219.875  229.4866 226.3875 235.6640  298.429   100
    # (strings %>% strsplit(" ") %>% map_chr(1))         682.123 693.965 747.1690 710.1495 752.3875  2578.091   100
    
  • 0

    您可以使用 purrr 包中的 map_*() 函数:

    strings %>% strsplit(" ") %>% map_chr(1)
    [1] "a"
    

    * 指的是您想要输出的类型, 1 指的是列表中的位置 .

    此选项可用于向量

    > c("a b c", "d e f") %>% strsplit(" ") %>% map_chr(1)
    [1] "a" "d"
    
  • 2

    我们可以做的

    strings %>% 
          strsplit(" ") %>%
          unlist %>%
          .[1]
    #[1] "a"
    
  • 0

    您可以在 unlist 之后使用 extract 这样的列表:

    strings %>% 
      strsplit(" ") %>%  
      unlist %>% 
      extract(1)
    

    希望这可以帮助!

  • 1

    这是100%的magrittr方式:

    library(magrittr)
    strings %>% strsplit(" ") %>% extract2(1) %>% extract(1)
    

    extract 只是 [ 的别名, extract2[[ 的别名,所以你也可以这样做:

    strings %>% strsplit(" ") %>% `[[`(1) %>% `[`(1)
    

    虽然在大多数情况下,这种形式通常更具可读性:

    strings %>% {strsplit(.," ")[[1]][1]}
    

相关问题