2016-06-07 40 views
2

我想通過%>%將數據幀傳遞給lapply,但我需要能夠訪問列的名稱,所以我的樂曲參數是這樣的:Magritttr + lapply其中第一個參數不是LHS

mydf %>% 
    lapply(1:length(.), function(x) { 
     manipulate_df(mydf[x], using_column_names(names(mydf)[x]) 
    }) 

然而,當我嘗試,我得到以下錯誤:

Error in match.fun(FUN) : 
    '1:length(.)' is not a function, character or symbol 

至於我可以告訴R和lapply不喜歡1:length(.)。我認爲一個有效的選擇是打破了鏈條,但我想學習如何正確地做到這一點。

+2

您可能需要閱讀'幫助( 「%>%」 )'。這不是'lapply()'「不喜歡」'1:length(。)'。您已通過'%>%'將'X'傳遞給'lapply()'。這是'mydf'。國際海事組織,最好在這裏以標準方式(即沒有鏈)調用lapply()。 –

回答

2

你這裏的問題是,%>%的插入是myDF作爲第一個參數(這樣三個參數獲得通過,以lapply嘗試包裹在括號中的整個lapply表達這樣可防止插入行爲:。

mydf %>% 
    { lapply(1:length(.), function(x) { 
     manipulate_df(mydf[x], using_column_names(names(mydf)[x]) 
    }) } 

我認爲最漂亮的解決將是使一個新的功能:

manipulate_whole_df = function(mydf) 
    lapply(1:length(mydf), function(x) 
      manipulate_df(mydf[x], using_column_names(names(mydf)[x]))) 

mydf %>% 
    manipulate_whole_df 

甚至

library(tidyr) 

mydf %>% 
    gather(variable, value) %>% 
    group_by(variable) %>% 
    do(manipulate_df(.$value, 
        .$variable %>% first %>% using_column_name)) 
0

lapply()該功能只引用列索引/列名,在不依賴於lapply迭代的方式引用mtcars,所以管的名稱

names(mtcars) %>% lapply(function(x) mtcars[x]) 

或寫一個正確關閉

names(mtcars) %>% lapply(function(x, df) df[x], df=mtcars) 

或者你可能並不真的需要訪問這些名字,但只是列?

mtcars %>% lapply(function(x) sqrt(sum(x))) 
0

我想你想要的是以下幾點:

mydf %>% length %>% seq %>% 
    lapply(function(x) { 
     manipulate_df(mydf[x], using_column_names(names(mydf)[x]) 
    }) 

,或者你可以使用lambda函數:

mydf %>% {1:length(.)} %>% 
    lapply(function(x) { 
     manipulate_df(mydf[x], using_column_names(names(mydf)[x]) 
    }) 
相關問題