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

Magritttr + lapply where first argument isn't to LHS

我想通过 %>% 将数据框传递到 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(.)。我想一个有效的选项正在打破链条,但我想学习如何正确地做到这一点。

您的问题是 %>% 将 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 ) )

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)))

我想你想要的是:

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] )
   })