在 R magrittr 管道的末尾使用 $ 美元符号到 return 向量
Use $ dollar sign at end of of an R magrittr pipeline to return a vector
我想在 magrittr
/tidyverse
管道的末尾使用 $
。 $
直接在 tidyverse
函数旁边工作,例如 read_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
我的问题是:
1) 为什么在管道末尾使用 $
不起作用的基础 explanations/mechanics 是什么?
2) 什么是我想要完成的最佳实践方法?具体来说,要获得一个向量作为管道的最终结果?
问题一:我觉得是分组的问题。将该语句的大部分内容括在括号中,它会产生与前两种方法相同的结果:
y <- (read_csv('tmp.csv') %>% filter(y > 0))$y
问题 2:新函数 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"]]
它不起作用,因为它认为函数是 $
,而不是 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
我想在 magrittr
/tidyverse
管道的末尾使用 $
。 $
直接在 tidyverse
函数旁边工作,例如 read_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
我的问题是:
1) 为什么在管道末尾使用 $
不起作用的基础 explanations/mechanics 是什么?
2) 什么是我想要完成的最佳实践方法?具体来说,要获得一个向量作为管道的最终结果?
问题一:我觉得是分组的问题。将该语句的大部分内容括在括号中,它会产生与前两种方法相同的结果:
y <- (read_csv('tmp.csv') %>% filter(y > 0))$y
问题 2:新函数 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"]]
它不起作用,因为它认为函数是 $
,而不是 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