我想使用qplot
(ggplot2),然后使用magrittr
转发数据:
这有效:
mtcars %>% qplot(mpg, cyl, data=.)
这会产生错误:
mtcars %>% qplot(mpg, cyl, data=.) %>% summarise(mean(mpg))
那些只生成摘要统计数据:
mtcars %T>% qplot(mpg, cyl, data=.) %>% summarise(mean(mpg))
mtcars %>% {qplot(mpg, cyl, data=.); .} %>% summarise(mean(mpg))
mtcars %T>% {qplot(mpg, cyl, data=.)} %>% summarise(mean(mpg))
有什么问题?我已经找到了this解决方案,但是从附带的代码中可以看出它没有帮助。
答案 0 :(得分:5)
所有ggplot2函数都返回一个表示绘图的对象 - 要查看它需要打印它。这通常在您在控制台中工作时自动发生,但需要在函数或链中明确显示。
我能想到的最优雅的解决方案是:
library("ggplot2")
library("magrittr")
library("dplyr")
echo <- function(x) {
print(x)
x
}
mtcars %>%
{echo(qplot(mpg, cyl, data = .))} %>%
summarise(mean(mpg))
似乎应该有更好的方法。
答案 1 :(得分:2)
这对我来说似乎更干净,因为它不需要使用%T>%
(IMHO使管道更难以重新排列和读取)并且表达式周围没有{}
以避免传递对象那里。我不确定传递物体并忽略它有多大的伤害。
我从来没有使用%T>%
T恤,我也不打算打印或绘图。而且我从来不想打印/绘制被自己管道的对象(通常是一个大数据集)。所以我从不使用%T>%
。
library("ggplot2")
library("dplyr")
pap = function(pass, to_print = NULL, side_effect = NULL) {
if( !is.null(to_print)) {
if (is.function(to_print)) {
print(to_print(pass))
} else {
print(to_print)
}
}
side_effect
invisible(pass)
}
mtcars %>%
pap(summary) %>%
pap(side_effect = plot(.)) %>%
pap(qplot(mpg, cyl, data = .)) %>%
summarise(mean(mpg))
我通常不会在我的烟斗中使用绘图作为副作用,因此上述解决方案最适合我(需要&#34;额外打字&#34;对于副作用图)。我希望能够自动消除这些预期情景(例如情节与qplot)之间的歧义,但尚未找到可靠的方法。