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

时间:2018-02-07 10:24:46

标签: r magrittr

使用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 :(得分:2)

或者:

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

答案 1 :(得分:1)

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

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

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

此选项可用于矢量

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

答案 2 :(得分:0)

我们可以做到

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

答案 3 :(得分:0)

您可以在#define fill(where_l, where_r, where_t, where_b, what_l, what_r, what_t, what_b) \ \ /*lt*/ \ *p++ = where_l; \ *p++ = where_t; \ *p++ = 0.5f; \ *p++ = 1.0f; \ *p++ = what_l; \ *p++ = what_t; \ \ /* rt */ \ *p++ = where_r; \ *p++ = where_t; \ *p++ = 0.5f; \ *p++ = 1.0f; \ *p++ = what_r; \ *p++ = what_t; \ \ /*lb*/ \ *p++ = where_l; \ *p++ = where_b; \ *p++ = 0.5f; \ *p++ = 1.0f; \ *p++ = what_l; \ *p++ = what_b; \ \ /*rb*/ \ *p++ = where_r; \ *p++ = where_b; \ *p++ = 0.5f; \ *p++ = 1.0f; \ *p++ = what_r; \ *p++ = what_b; int main(int argc, char **argv) { float* p = (float*)malloc(999); fill(1, 2, 3, 4, 5, 6, 7, 8) } 列表之后使用extract,如下所示:

unlist

希望这有帮助!

答案 4 :(得分:0)

这是100%的magrittr方式:

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

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

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

虽然在大多数情况下,此表单通常更具可读性:

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