我想在R中使用赋值运算符结束管道
我的目标(在伪R中):
data %>% analysis functions %>% analyzedData
Run Code Online (Sandbox Code Playgroud)
其中data和analyzeData都是data.frame.
我尝试了一些这方面的变种,每个都给出了一个独特的错误信息.我试过的一些迭代:
data %>% analysis functions %>% -> analyzedData
data %>% analysis functions %>% .-> analyzedData
data %>% analysis functions %>% <-. analyzedData
data %>% analysis functions %>% <- analyzedData
Run Code Online (Sandbox Code Playgroud)
错误消息:
Error in function_list[[k]](value) :
could not find function "analyzedData"
Error: object 'analyzedData' not found
Error: unexpected assignment in: ..
Run Code Online (Sandbox Code Playgroud)
更新:我想出这样做的方式是:
data %>% do analysis %>% {.} -> analyzedData
Run Code Online (Sandbox Code Playgroud)
这样,要对长管道进行故障排除/调试,可以将这两行放入管道中,以最大限度地减少代码重新运行并隔离问题.
data %>% pipeline functions %>%
{.}-> tempWayPoint
tmpWayPoint %>%
more pipeline functions %>% {.} -> endPipe
Run Code Online (Sandbox Code Playgroud)
Das*_*son 11
作为第一件事(如scoa提及),这可能是最简单的做法,但如果你真的想把它放在最后你可以使用 assign
mtcars %>%
group_by(cyl) %>%
summarize(m = mean(hp)) %>%
assign("bar", .)
Run Code Online (Sandbox Code Playgroud)
将输出存储到"bar"
或者你可以使用->运算符.你在问题中提到它,但看起来你喜欢使用类似的东西
mtcars %>% -> yourvariable
Run Code Online (Sandbox Code Playgroud)
代替
mtcars -> yourvariable
Run Code Online (Sandbox Code Playgroud)
你不想拥有%>%在前面->
看起来你正试图%>%用创建新对象的副作用来装饰管道操作符.可以假设您可以使用赋值运算符->,但它不能在管道中使用.这是因为它->具有比用户定义的运算符更低的优先级%>%,这会影响解析:您的管道将被解析为(initial_stages) -> (final_stages)无意义的.
解决方案是替换->为用户定义的版本.虽然我们正在使用它,但我们不妨使用该lazyeval包,以确保它将创建它应该去的对象:
`%->%` <- function(value, x)
{
x <- lazyeval::lazy(x)
assign(deparse(x$expr), value, x$env)
value
}
Run Code Online (Sandbox Code Playgroud)
使用中的一个例子:
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
Run Code Online (Sandbox Code Playgroud)
您可以将管道链视为多行函数,它与其他所有多行函数一样工作。保存输出的通常方法是在第一行分配它:
analyzedData <- data %>% analysis functions
Run Code Online (Sandbox Code Playgroud)
就像您会做的那样:
plot <- ggplot(data,aes(x=x,y=x)) +
geom_point()
Run Code Online (Sandbox Code Playgroud)