如何调用使用 magrittr 管道创建的对象的元素?
How to call an element of an object created with a magrittr pipe?
我们使用 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..
现在回答我的问题:有没有一种方法可以在不需要将整个表达式放在大括号中的情况下使用管道运算符?我认为,如果我们不必将其写入临时变量或使用方括号,而是使用某种特殊的管道运算符,它会更加透明。
还有其他方法吗?
您可以使用 purrr
包中的 map_*()
函数:
strings %>% strsplit(" ") %>% map_chr(1)
[1] "a"
*
指的是您想要作为输出的类型,1
指的是列表中的位置。
此选项可用于矢量
> c("a b c", "d e f") %>% strsplit(" ") %>% map_chr(1)
[1] "a" "d"
我们可以做到
strings %>%
strsplit(" ") %>%
unlist %>%
.[1]
#[1] "a"
或者:
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
您可以在 unlist
您的列表之后使用 extract
,如下所示:
strings %>%
strsplit(" ") %>%
unlist %>%
extract(1)
希望对您有所帮助!
这是 100% magrittr 的方法:
library(magrittr)
strings %>% strsplit(" ") %>% extract2(1) %>% extract(1)
extract
只是[
的别名,extract2
是[[
的别名,所以你也可以这样做:
strings %>% strsplit(" ") %>% `[[`(1) %>% `[`(1)
虽然在大多数情况下,这种形式通常更具可读性:
strings %>% {strsplit(.," ")[[1]][1]}
我们使用 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..
现在回答我的问题:有没有一种方法可以在不需要将整个表达式放在大括号中的情况下使用管道运算符?我认为,如果我们不必将其写入临时变量或使用方括号,而是使用某种特殊的管道运算符,它会更加透明。
还有其他方法吗?
您可以使用 purrr
包中的 map_*()
函数:
strings %>% strsplit(" ") %>% map_chr(1)
[1] "a"
*
指的是您想要作为输出的类型,1
指的是列表中的位置。
此选项可用于矢量
> c("a b c", "d e f") %>% strsplit(" ") %>% map_chr(1)
[1] "a" "d"
我们可以做到
strings %>%
strsplit(" ") %>%
unlist %>%
.[1]
#[1] "a"
或者:
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
您可以在 unlist
您的列表之后使用 extract
,如下所示:
strings %>%
strsplit(" ") %>%
unlist %>%
extract(1)
希望对您有所帮助!
这是 100% magrittr 的方法:
library(magrittr)
strings %>% strsplit(" ") %>% extract2(1) %>% extract(1)
extract
只是[
的别名,extract2
是[[
的别名,所以你也可以这样做:
strings %>% strsplit(" ") %>% `[[`(1) %>% `[`(1)
虽然在大多数情况下,这种形式通常更具可读性:
strings %>% {strsplit(.," ")[[1]][1]}