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

标签 r dplyr magrittr

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

# 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

关于r - 在 R magrittr 管道末尾使用 $ 美元符号返回向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48130776/

相关文章:

r - R中的Stata "."相当于什么

r - read.table : ! header 中的错误:无效的参数类型

r - R中数据帧中的最小值大于0

r - 有没有一种方法可以在将一个 data.frame 连接到另一个时替换匹配行上的列值?

r - 使用 Magrittr 从闭包构造函数会导致函数评估出错

带有 dplyr 和 magrittr 的 rollmean

java - R树库+如何运行

r - 将函数应用于 data.frame 的异构行

r - 如何应用函数来改变特定的列组合? (purrr::使用首选)

r - 我该如何正确处理管道?