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] )
})
我想通过 %>%
将数据框传递到 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] )
})