在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