簡體   English   中英

dplyr + magrittr + qplot =沒有情節?

[英]dplyr + magrittr + qplot = no plot?

我想用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))

問題是什么? 我已經找到了這個解決方案,但是從附帶的代碼中可以看出它沒有幫助。

所有ggplot2函數都返回一個表示繪圖的對象 - 要查看它需要打印它。 這通常在您在控制台中工作時自動發生,但需要在函數或鏈中明確顯示。

我能想出的最優雅的解決方案是:

library("ggplot2")
library("magrittr")
library("dplyr")

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

似乎應該有更好的方法。

這對我來說似乎更干凈,因為它不需要使用%T>% (IMHO使管道更難以重新排列和讀取)並且在表達式周圍沒有{}以避免將對象傳遞到那里。 我不確定傳遞對象並忽略它有多大的傷害。

我從來沒有使用%T>% tee,我不想打印或繪圖。 而且我從來不想打印/繪制被自己管道的對象(通常是一個大數據集)。 所以我從不使用%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)之間的歧義,但是沒有找到可靠的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM