Magritttr + lapply,其中第一个参数不是LHS

时间:2016-06-07 16:49:03

标签: r dplyr lapply magrittr

我想通过%>%将数据框传递给lapply,但是我需要能够访问列的名称,所以我的lapply参数是这样的:

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(.)。我认为一个有效的选择是打破链条,但我想学习如何正确地做到这一点。

3 个答案:

答案 0 :(得分: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 ) )

答案 1 :(得分: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)))

答案 2 :(得分: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] )
   })