【问题标题】:R: Using piping to pass a single argument to multiple locations in a functionR:使用管道将单个参数传递到函数中的多个位置
【发布时间】:2017-10-08 11:02:53
【问题描述】:

我正在尝试专门使用管道来重写以下代码(使用 babynames 包中的 babynames 数据:

library(babynames)
library(dplyr)

myDF <- babynames %>% 
group_by(year) %>% 
summarise(totalBirthsPerYear = sum(n))

slice(myDF, seq(1, nrow(myDF), by = 20))

我得到的最接近的是这段代码(不工作):

myDF <- babyNames %>% 
group_by(year) %>% 
summarise(totalBirthsPerYear = sum(n)) %>% 
slice( XXX, seq(1, nrow(XXX), by = 20))

其中 XXX 应该通过管道传递给切片,但我被卡住了。任何帮助表示赞赏。

【问题讨论】:

  • 最后一行应该是slice(seq(1, nrow(.), by = 20))。您不需要第一个XXX,因为summarise 的输出已经自动通过管道传输到slice。第二个XXX. 替换,其中. 是“代词”,用于指代通过管道传输到函数中的数据帧。
  • 壮观,非常感谢!

标签: r piping magrittr


【解决方案1】:

您可以使用. 在函数中的不同位置引用管道数据在您的情况下:

myDF2 <- babynames %>%
    group_by(year) %>%
    summarize(totalBirthsPerYear = sum(n)) %>%
    slice(seq(1, nrow(.), by = 20))

【讨论】:

    【解决方案2】:

    不确定这是否应该作为一个单独的问题和答案打开,但如果有人像我一样来到这里寻找标题中 MULTIPLE 的答案: R:使用管道将单个参数传递到函数中的多个位置

    在多个地方使用 Andrew 的答案中的. 也可以实现这一点。

    [示例] 要获取向量 vec <- c("first", "middle", "last") 的最后一个元素,我们可以使用此代码。

    vec[length(vec)]
    

    使用管道,下面的代码实现了同样的事情:

    vec %>% .[length(.)] 
    

    希望这对其他人有帮助,因为它会帮助我(我知道.,但无法让它在多个位置工作)。

    【讨论】: