如何用赋值运算符结束管道?
How do you end a pipe with an assignment operator?
我想用 R 中的赋值运算符结束管道。
我的目标(在伪 R 中):
data %>% analysis functions %>% analyzedData
其中 data 和 analyzedData 都是 data.frame。
我已经尝试了几个变体,每个变体都给出了独特的错误消息。
我试过的一些迭代:
data %>% analysis functions %>% -> analyzedData
data %>% analysis functions %>% .-> analyzedData
data %>% analysis functions %>% <-. analyzedData
data %>% analysis functions %>% <- analyzedData
错误信息:
Error in function_list[[k]](value) :
could not find function "analyzedData"
Error: object 'analyzedData' not found
Error: unexpected assignment in: ..
更新:
我想出的方法是:
data %>% do analysis %>% {.} -> analyzedData
这样,要对长管道进行故障排除/调试,您可以将这两行放入您的管道中,以最大程度地减少代码重新运行并隔离问题。
data %>% pipeline functions %>%
{.}-> tempWayPoint
tmpWayPoint %>%
more pipeline functions %>% {.} -> endPipe
更新:我想到的方法是:data %>% do analysis %>% {.} -> analyzedData
这样,要对长管道进行故障排除/调试,您可以将这两行放入管道中,以最大限度地减少代码重新运行并隔离问题。
data %>% pipeline functions %>%
{.}-> tempWayPoint
tmpWayPoint %>%
more pipeline functions %>% {.} -> endPipe
如果你有更好的方法请告诉我。
您可以将管道链视为一个多线函数,它与其他所有多线函数一样工作。通常保存输出的方法是在第一行分配它:
analyzedData <- data %>% analysis functions
就像你会做的那样:
plot <- ggplot(data,aes(x=x,y=x)) +
geom_point()
将赋值作为第一件事可能是最简单的(就像 scoa 提到的那样)但是如果你真的想把它放在最后你可以使用 assign
mtcars %>%
group_by(cyl) %>%
summarize(m = mean(hp)) %>%
assign("bar", .)
这会将输出存储到 "bar"
或者您可以只使用 ->
运算符。您在问题中提到了它,但看起来您使用的是
mtcars %>% -> yourvariable
而不是
mtcars -> yourvariable
你不想在 ->
前面有 %>%
看起来您正试图用创建新对象的副作用来修饰 %>%
管道运算符。人们会假设您可以为此使用赋值运算符 ->
,但它不会在管道中工作。这是因为 ->
的优先级低于 %>%
等用户定义的运算符,这会扰乱解析:您的管道将被解析为 (initial_stages) -> (final_stages)
,这是无意义的。
一种解决方案是将 ->
替换为用户定义的版本。当我们这样做的时候,我们也可以使用 lazyeval
包,以确保它会在它应该去的地方创建对象:
`%->%` <- function(value, x)
{
x <- lazyeval::lazy(x)
assign(deparse(x$expr), value, x$env)
value
}
使用中的示例:
smry <- mtcars %>%
group_by(cyl) %->% # ->, not >
tmp %>%
summarise(m=mean(mpg))
tmp
#Source: local data frame [32 x 11]
#Groups: cyl
#
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#.. ... ... ... ... ... ... ... .. .. ... ...
smry
#Source: local data frame [3 x 2]
#
# cyl m
#1 4 26.66364
#2 6 19.74286
#3 8 15.10000
你想要的也可以使用大括号,例如
data %>% analysis_functions %>% {analyzedData <<-.}
并且您还可以在对象分配后扩展管道。我发现在长链的末尾分配一个数据帧非常方便,然后将其输送到 ggplot 或在 tidy()
ing 之前保存模型对象用于其他目的。
我想用 R 中的赋值运算符结束管道。
我的目标(在伪 R 中):
data %>% analysis functions %>% analyzedData
其中 data 和 analyzedData 都是 data.frame。
我已经尝试了几个变体,每个变体都给出了独特的错误消息。 我试过的一些迭代:
data %>% analysis functions %>% -> analyzedData
data %>% analysis functions %>% .-> analyzedData
data %>% analysis functions %>% <-. analyzedData
data %>% analysis functions %>% <- analyzedData
错误信息:
Error in function_list[[k]](value) :
could not find function "analyzedData"
Error: object 'analyzedData' not found
Error: unexpected assignment in: ..
更新: 我想出的方法是:
data %>% do analysis %>% {.} -> analyzedData
这样,要对长管道进行故障排除/调试,您可以将这两行放入您的管道中,以最大程度地减少代码重新运行并隔离问题。
data %>% pipeline functions %>%
{.}-> tempWayPoint
tmpWayPoint %>%
more pipeline functions %>% {.} -> endPipe
更新:我想到的方法是:data %>% do analysis %>% {.} -> analyzedData
这样,要对长管道进行故障排除/调试,您可以将这两行放入管道中,以最大限度地减少代码重新运行并隔离问题。
data %>% pipeline functions %>%
{.}-> tempWayPoint
tmpWayPoint %>%
more pipeline functions %>% {.} -> endPipe
如果你有更好的方法请告诉我。
您可以将管道链视为一个多线函数,它与其他所有多线函数一样工作。通常保存输出的方法是在第一行分配它:
analyzedData <- data %>% analysis functions
就像你会做的那样:
plot <- ggplot(data,aes(x=x,y=x)) +
geom_point()
将赋值作为第一件事可能是最简单的(就像 scoa 提到的那样)但是如果你真的想把它放在最后你可以使用 assign
mtcars %>%
group_by(cyl) %>%
summarize(m = mean(hp)) %>%
assign("bar", .)
这会将输出存储到 "bar"
或者您可以只使用 ->
运算符。您在问题中提到了它,但看起来您使用的是
mtcars %>% -> yourvariable
而不是
mtcars -> yourvariable
你不想在 ->
%>%
看起来您正试图用创建新对象的副作用来修饰 %>%
管道运算符。人们会假设您可以为此使用赋值运算符 ->
,但它不会在管道中工作。这是因为 ->
的优先级低于 %>%
等用户定义的运算符,这会扰乱解析:您的管道将被解析为 (initial_stages) -> (final_stages)
,这是无意义的。
一种解决方案是将 ->
替换为用户定义的版本。当我们这样做的时候,我们也可以使用 lazyeval
包,以确保它会在它应该去的地方创建对象:
`%->%` <- function(value, x)
{
x <- lazyeval::lazy(x)
assign(deparse(x$expr), value, x$env)
value
}
使用中的示例:
smry <- mtcars %>%
group_by(cyl) %->% # ->, not >
tmp %>%
summarise(m=mean(mpg))
tmp
#Source: local data frame [32 x 11]
#Groups: cyl
#
# mpg cyl disp hp drat wt qsec vs am gear carb
#1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
#2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
#3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
#5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
#.. ... ... ... ... ... ... ... .. .. ... ...
smry
#Source: local data frame [3 x 2]
#
# cyl m
#1 4 26.66364
#2 6 19.74286
#3 8 15.10000
你想要的也可以使用大括号,例如
data %>% analysis_functions %>% {analyzedData <<-.}
并且您还可以在对象分配后扩展管道。我发现在长链的末尾分配一个数据帧非常方便,然后将其输送到 ggplot 或在 tidy()
ing 之前保存模型对象用于其他目的。