首页 > 解决方案 > 如何将两个输入传递给 R 中的 %>% 运算符

问题描述

最初我有这段代码,我试图使用 %>% 运算符来简化和提高可读性。

#Get Sunday's from 2018-01-01 till today
d = seq(as.Date("2018-01-01"),Sys.Date()+365,by='day')
HolidayList = data.frame(Holidays=d[weekdays(d)=='Sunday'])

#Get Alternate saturdays 2nd and 4th
d = seq(as.Date("2018-01-01"),Sys.Date()+365,by='day')
saturdayList = d[weekdays(d)=='Saturday']
altSaturdayList = lapply(split(saturdayList, format(saturdayList, "%Y-%m")), function(x)
  na.omit(x[c(2,4)]))
altSaturdayList = as.data.frame(altSaturdayList)
altSaturdayList = gather(altSaturdayList)
altSaturdayList = subset(altSaturdayList,select = c(value))
HolidayList = rbind(HolidayList, setNames(altSaturdayList, "Holidays"))
HolidayList = rbind(HolidayList, setNames(as.data.frame(as.Date("2018-11-06")), "Holidays"))
HolidayList = unique(HolidayList)
HolidayList = arrange(HolidayList,Holidays)
rm(d)
rm(saturdayList)
rm(altSaturdayList)

我不想存储中间变量,这就是为什么我认为管道运算符是一个不错的选择,但我无法重现结果。

这是我尝试过的

HolidayList = saturdayList %>% 
    data.frame(lapply(split(saturdayList, format(saturdayList, "%Y-%m")), function(x)
    na.omit(x[c(2,4)]))) %>% 
    subset(gather(altSaturdayList),select = c(value)) %>% 
    rbind(HolidayList, setNames(altSaturdayList, "Holidays")) %>% 
    rbind(HolidayList, setNames(as.data.frame(as.Date("2018-11-06")), "Holidays")) %>% 
    arrange(unique(HolidayList),Holidays)

Holidays数据框有我试图绑定和添加新日期的日期。

如何在不创建新变量的情况下获取每个步骤的输出并将其作为输入放入下一行?

请解释这些步骤,以便我可以理解简化上述代码的过程。

标签: rpipereadability

解决方案


有专门为管道操作员设计的功能tidyverse。这些函数非常适合使用管道运算符,而不是使用基本 R 运算符并尝试将它们放入管道中。tidyverse您仍然可以在管道中使用基本 R 函数,但使用工具使用它们更方便。

library(tidyverse)

temp <- map_dfr(split(saturdayList,format(saturdayList, "%Y-%m")), ~ .[c(2, 4)]) %>%
    gather(key, Holidays) %>%
    select(Holidays) %>%
    bind_rows(HolidayList) %>%
    add_row(Holidays = as.Date("2018-11-06")) %>%
    unique() %>%
    na.omit() %>%
    arrange(Holidays) 

temp

#   Holidays  
#   <date>    
# 1 2018-01-07
# 2 2018-01-13
# 3 2018-01-14
# 4 2018-01-21
# 5 2018-01-27
# 6 2018-01-28
# 7 2018-02-04
# 8 2018-02-10
# 9 2018-02-11
#10 2018-02-18
# … with 160 more rows

为了确认它们的输出是否相同,我们可以转换temp为数据框,然后HolidayList在最后一步进行比较。

identical(data.frame(temp), HolidayList)
#[1] TRUE

推荐阅读