这个问题在这里已有答案:
我正在编写一个带有几个管道的函数 . 我想在最后一个管道之前将一些步骤保存为.tbl或数据框 . 例如: a %>% b %>% c ,我想保存步骤 'c' ,但也想要步骤 'b' .
a %>% b %>% c
'c'
'b'
我知道一个选择是做两个管道,但我相信必须有更好的方法 .
cars %>% mutate(kmh = dist/speed) %>% summary()
谢谢您的帮助 . 我found使用大括号{}和 - >>更好的解决方案 . 见下文
c = cars %>% mutate(var1 = dist*speed)%>% {. ->> b } %>% #here is save summary() c head(b)
不知道为什么会需要它 . 但是@Frank建议一个选项是使用 magrittr 包中的 %T>% 运算符( tee operator )和 assign 函数来存储中间值 .
magrittr
%T>%
tee operator
assign
在下面的代码中, SummaryVal 将 cars 的信息 summary 和 MyValue 将保持 mutate 之后的中间值 .
SummaryVal
cars
summary
MyValue
mutate
library(tidyverse) library(magrittr) SummaryVal <- cars %>% mutate(kmh = dist/speed) %T>% assign("MyValue",.,envir = .GlobalEnv) %>% summary() head(MyValue) # speed dist kmh # 1 4 2 0.5000000 # 2 4 10 2.5000000 # 3 7 4 0.5714286 # 4 7 22 3.1428571 # 5 8 16 2.0000000 # 6 9 10 1.1111111 SummaryVal # speed dist kmh # Min. : 4.0 Min. : 2.00 Min. :0.500 # 1st Qu.:12.0 1st Qu.: 26.00 1st Qu.:1.921 # Median :15.0 Median : 36.00 Median :2.523 # Mean :15.4 Mean : 42.98 Mean :2.632 # 3rd Qu.:19.0 3rd Qu.: 56.00 3rd Qu.:3.186 # Max. :25.0 Max. :120.00 Max. :5.714
UPDATED: 正如@Renu正确指出的那样 %>% 将如下工作:
%>%
SummaryVal <- cars %>% mutate(kmh = dist/speed) %>% assign("MyValue",.,envir = .GlobalEnv) %>% summary()
列表和功能是要走的路 . 使调试变得简单并且仍然可读 . 这是一个小例子 . 您需要在函数中包含一些错误处理,以确保您提供的数据符合您的预期等 . 函数将返回包含结果的列表 . 为了防止你想要单独的data.frames而不是一个大的列表,最后一行代码将列表中的所有data.frame作为单独的data.frames .
library(dplyr) # create a function my_summaries <- function(x){ # error handling goes here my_mutate <- x %>% mutate(kmh = dist/speed) my_summary <- my_mutate %>% summary() list(mutate = my_mutate, summary = my_summary) } my_data <- my_summaries(cars) str(my_data) List of 2 $ mutate :'data.frame': 50 obs. of 3 variables: ..$ speed: num [1:50] 4 4 7 7 8 9 10 10 10 11 ... ..$ dist : num [1:50] 2 10 4 22 16 10 18 26 34 17 ... ..$ kmh : num [1:50] 0.5 2.5 0.571 3.143 2 ... $ summary: 'table' chr [1:6, 1:3] "Min. : 4.0 " "1st Qu.:12.0 " "Median :15.0 " "Mean :15.4 " ... ..- attr(*, "dimnames")=List of 2 .. ..$ : chr [1:6] "" "" "" "" ... .. ..$ : chr [1:3] " speed" " dist" " kmh" # Unlist list of data.frames list2env(my_data ,.GlobalEnv)
3 回答
谢谢您的帮助 . 我found使用大括号{}和 - >>更好的解决方案 . 见下文
不知道为什么会需要它 . 但是@Frank建议一个选项是使用
magrittr
包中的%T>%
运算符(tee operator
)和assign
函数来存储中间值 .在下面的代码中,
SummaryVal
将cars
的信息summary
和MyValue
将保持mutate
之后的中间值 .UPDATED: 正如@Renu正确指出的那样
%>%
将如下工作:列表和功能是要走的路 . 使调试变得简单并且仍然可读 . 这是一个小例子 . 您需要在函数中包含一些错误处理,以确保您提供的数据符合您的预期等 . 函数将返回包含结果的列表 . 为了防止你想要单独的data.frames而不是一个大的列表,最后一行代码将列表中的所有data.frame作为单独的data.frames .