【问题标题】:Use $ dollar sign at end of of an R magrittr pipeline to return a vector在 R magrittr 管道末尾使用 $ 美元符号返回向量
【发布时间】:2018-01-06 18:58:19
【问题描述】:

我想在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) 什么是我想要完成的最佳实践方式?具体来说,要获得一个向量作为管道的最终结果?

【问题讨论】:

标签: r dplyr magrittr


【解决方案1】:

它不起作用,因为它认为函数是$,而不是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

【讨论】:

  • 不错的答案!另外:DF %&gt;% filter(y &gt; 0) %&gt;% .$y
  • 为什么是 "$"(., filter(y &gt; 0), y) 而不仅仅是 "$"(filter(y &gt; 0), y) ?这里的“点”有什么意义?
  • 为什么DF %&gt;% filter(y &gt; 0) %&gt;% "$"(y) 有效而DF %&gt;% filter(y &gt; 0) %&gt;%$y 无效?
  • 语法 $y 不是 R 接受的语法。要么使用 sometthing$y,要么使用带括号的常用函数表示法。
【解决方案2】:

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

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"]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2015-03-12
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多