2017-07-27 72 views
3

當從purrr使用管道和map()函數時,我對如何傳遞數據和變量感到困惑。舉例來說,此代碼的工作,因爲我想到:管道如何使用purrr map()函數和「。」 (點)符號

library(tidyverse) 

cars %>% 
    select_if(is.numeric) %>% 
    map(~hist(.)) 

然而,當我嘗試類似的東西使用ggplot,它的行爲在一個陌生的方式。

cars %>% 
    select_if(is.numeric) %>% 
    map(~ggplot(cars, aes(.)) + geom_histogram()) 

我猜這是因爲「。」在這種情況下,將向量傳遞給aes(),該列表期望列名。無論哪種方式,我希望我可以使用管道和map()將每個數字列傳遞給ggplot函數。提前致謝!

+0

您也可以嘗試'轎車%>% select_if(is.numeric)%>% 地圖(〜qplot())',雖然ggplots'快速情節被認爲是過時,我認爲。 – lukeA

回答

6
cars %>% 
    select_if(is.numeric) %>% 
    map2(., names(.), 
     ~{ggplot(data_frame(var = .x), aes(var)) + 
      geom_histogram() + 
      labs(x = .y)     }) 

enter image description here

enter image description here

有一些額外的步驟。

  • 使用map2而不是map。第一個參數是你傳遞它的數據幀,第二個參數是該數據幀的一個向量,所以它知道map結束了什麼。因此,ggplot只適用於數據框和強制對象。
  • 這也讓你可以使用.y代名詞來命名劇情。
8

您不應該將原始數據傳遞給審美映射。相反,你應該動態構建data.frame。例如

cars %>% 
    select_if(is.numeric) %>% 
    map(~ggplot(data_frame(x=.), aes(x)) + geom_histogram()) 
+0

我很驚訝這種方法的工作,但由於數據幀真的是矢量列表,我認爲這是有道理的。 – Brian

+0

我喜歡這個簡潔。有沒有辦法在不使用map2的情況下添加x軸標題?或者purrr對待每個「。」迭代作爲一個沒有名字的數字向量?謝謝!! –

+1

唉,嗚嗚聲不會傳遞姓名。您需要像map2那樣顯式傳遞它 – MrFlick