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

jmu*_*amp 3 r dplyr magrittr

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

# 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
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

2)什么是我想要完成的最佳实践方式?具体来说,获取一个向量作为管道的最终结果?

G. *_*eck 9

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

"$"(., filter(y > 0), y)
Run Code Online (Sandbox Code Playgroud)

这当然没有意义.

假设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
Run Code Online (Sandbox Code Playgroud)

  • 不错的答案!另外:`DF %&gt;% filter(y &gt; 0) %&gt;% .$y` (2认同)