我想使用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解决方案,但是它没有帮助,正如您从附加的代码中看到的那样。
发布于 2014-12-04 15:06:25
所有ggplot2函数都返回一个表示一个绘图的对象-要查看它,就需要打印它。当您在控制台中工作时,通常会自动发生这种情况,但需要在函数或链中显式显示。
我能想到的最优雅的解决方案是:
library("ggplot2")
library("magrittr")
library("dplyr")
echo <- function(x) {
print(x)
x
}
mtcars %>%
{echo(qplot(mpg, cyl, data = .))} %>%
summarise(mean(mpg))看来应该有更好的办法。
发布于 2016-02-02 17:00:27
在我看来,这似乎更清晰,因为它不需要使用%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))我通常不使用绘图作为副作用在我的管道,所以以上的解决方案最适合我(需要“额外输入”的副作用图)。我希望能够自动地消除这些预期场景之间的歧义(例如,绘图和qplot),但还没有找到可靠的方法。
https://stackoverflow.com/questions/27296022
复制相似问题