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

在R magrittr管道的末尾使用$dollar符号返回向量,r,dplyr,magrittr,R,Dplyr,Magrittr,我想在magrittr/tidyverse管道的末尾使用$$直接在tidyverse函数(如read\u 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

我想在
magrittr
/
tidyverse
管道的末尾使用
$
$
直接在
tidyverse
函数(如
read\u 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
#加载库并创建虚拟数据文件
图书馆(dplyr)
图书馆(readr)
写入csv(数据帧(x=c(0,1),y=c(0,2)),'tmp.csv')
#这很有效

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

y <- (read_csv('tmp.csv') %>% filter(y > 0))$y
旧的方法是将data.frame视为一个列表,并提取单个元素。最后一行上的点是管道输出的magrittr语法

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

它不工作,因为它认为函数是
$
,而不是
过滤器
,并尝试运行:

"$"(., 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
DF%过滤器(y>0)%%>%“$”(y)
## [1] 1 2 3
DF%>%{filter(,y>0)$y}
## [1] 1 2 3
DF%%>%过滤器(y>0)%%>%“[[”(“y”)
## [1] 1 2 3
图书馆(magrittr)#提供extract2作为[[
DF%%>%过滤器(y>0)%%>%2提取(“y”)
## [1] 1 2 3

有一些重叠w/。它没有解决你的问题1。但它提供了我在下面提倡的替代方案。回答很好!还有:
DF%>%filter(y>0)%>%。$y
为什么是
“$”(,filter(y>0),y)
而不仅仅是
“$”(filter(y>0),y)
?这里“dot”的意义是什么?为什么
DF%>%filter(y>0)%%“$”(y)
工作,而
DF%%>%filter(y>0)%%>%y
不工作?语法
$y
不为R所接受。请使用
sometthing$y
或使用带有参数的常用函数表示法。
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