如何使用 purrr::reduce() 将表达式列表应用于数据框?

问题描述 投票:0回答:0

我在另一个问题上看到了这个想法here.

我使用 rlang::enexprs() 创建了一个函数列表,然后我想将这个列表应用到一个数据框上,所以我得到了一个应用了所有函数的框架。

我试过类似的东西:

select.expr <- function(...){
  rlang::enexprs(...)
}


apply.expr <- function (df, filtre.list) { 
 eval_df <- function(df, expr) { 
  rlang::eval_tidy (expr, data = df) } 
   purrr::reduce (filtre.list, eval_df, .init = df) 
}

但它并没有像我希望的那样工作。如果我举个例子:

data <- data.frame(a = c(1,1,1,1),
                  b = c(2,2,2,2),
                  c = c(3,3,3,3))

select.expr <- function(...){
  rlang::enexprs(...)
}


expr <- select.expr(replace(data, data ==2 , "two"), replace(data, data ==3 , "three"))

apply.expr(data, expr)
  a b     c
1 1 2 three
2 1 2 three
3 1 2 three
4 1 2 three

这仅在我将数据框“数据”作为 eval_df 中的参数传递时才有效

apply.expr <- function (df, filtre.list) { 
     eval_df <- function(data, expr) { 
         rlang::eval_tidy (expr, data = data) } 
     purrr::reduce (filtre.list, eval_df, .init = df) 
 }

apply.expr(data, expr)
  a   b     c
1 1 two three
2 1 two three
3 1 two three
4 1 two three

但是我不能将我的函数 apply.expr() 与另一个数据框一起使用。我也试过 map() 。 有一种方法可以创建一个将表达式列表应用于任何日期框架的函数吗?

r rstudio rlang
© www.soinside.com 2019 - 2024. All rights reserved.