在 R magrittr 管道的末尾使用 $ 美元符号返回向量



我想在magrittr/tidyverse管道的末尾使用$$直接在read_csvfiltertidyverse函数旁边工作,但是一旦我创建一个管道,%>%它就会引发错误。 这是一个简单的可重现示例。

# Load libraries and create a dummy data file
library(dplyr)
library(readr)
write_csv(data_frame(x=c(0,1), y=c(0,2)), 'tmp.csv')
# This works
y <- read_csv('tmp.csv')$y
str(y)
# This also works
df_y <- read_csv('tmp.csv')
y <- filter(df_y, y > 0)$y
str(y)
# This does not work
y <- read_csv('tmp.csv') %>% filter(y > 0)$y

我的问题是:

1(为什么在管道末端使用$不起作用的基本解释/机制是什么?

2( 对于我想要完成的目标,最佳实践方法是什么? 具体来说,获取矢量作为管道的最终结果?

它不起作用,因为它认为函数是$,而不是filter,并尝试运行:

"$"(., filter(y > 0), y)

当然,这毫无意义。

假设DF如下所示。 然后,任何后续代码行都按预期工作:

DF <- data.frame(y = seq(-3, 3))
DF %>% filter(y > 0) %>% "$"(y)
## [1] 1 2 3
DF %>% { filter(., y > 0)$y }
## [1] 1 2 3
DF %>% filter(y > 0) %>% "[["("y")
## [1] 1 2 3
library(magrittr) # supplies extract2 as an alias for [[
DF %>% filter(y > 0) %>% extract2("y")
## [1] 1 2 3

问题1:我认为问题是分组。 将该语句的大部分内容括在括号中,它会产生与前两种方法相同的结果:

y <- (read_csv('tmp.csv') %>% filter(y > 0))$y

问题 2:newwish 函数dplyr::pull()是我更喜欢拉出单个向量,而不是返回整个 data.frame。

read_csv('tmp.csv') %>% 
  filter(y > 0) %>% 
  dplyr::pull(y)

较旧的方法是将 data.frame 视为列表,并提取单个元素。 最后一行的点是管道输出的 magrittr 语法。

read_csv('tmp.csv') %>% 
  filter(y > 0) %>% 
  .[["y"]]

最新更新