首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr + magrittr + plot =无绘图?

dplyr + magrittr + plot =无绘图?
EN

Stack Overflow用户
提问于 2014-12-04 14:04:02
回答 2查看 892关注 0票数 4

我想使用qplot (ggplot2),然后用magrittr转发数据

这样做是可行的:

代码语言:javascript
复制
mtcars %>% qplot(mpg, cyl, data=.)

这会产生一个错误:

代码语言:javascript
复制
mtcars %>% qplot(mpg, cyl, data=.) %>% summarise(mean(mpg))

而这些数据只提供汇总统计数据:

代码语言:javascript
复制
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解决方案,但是它没有帮助,正如您从附加的代码中看到的那样。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-04 15:06:25

所有ggplot2函数都返回一个表示一个绘图的对象-要查看它,就需要打印它。当您在控制台中工作时,通常会自动发生这种情况,但需要在函数或链中显式显示。

我能想到的最优雅的解决方案是:

代码语言:javascript
复制
library("ggplot2")
library("magrittr")
library("dplyr")

echo <- function(x) {
  print(x)
  x
}
mtcars %>% 
  {echo(qplot(mpg, cyl, data = .))} %>% 
  summarise(mean(mpg))

看来应该有更好的办法。

票数 6
EN

Stack Overflow用户

发布于 2016-02-02 17:00:27

在我看来,这似乎更清晰,因为它不需要使用%T>% ( IMHO使管道更难重新排列和读取),并且不需要在表达式周围使用{}来避免将对象传递到那里。我不知道通过和忽略这个对象有多大的害处。

我从来没有使用过的%T>% T恤,我也不想打印或绘图。我从来不想打印/绘制被管道化的对象本身(通常是一个大的数据集)。所以我从不使用%T>%

代码语言:javascript
复制
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),但还没有找到可靠的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27296022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档