【问题标题】:using lapply with list of arguments on dplyr functions that uses data masking在使用数据屏蔽的 dplyr 函数上使用带有参数列表的 lapply
【发布时间】:2022-11-03 18:24:11
【问题描述】:

使用 dplyr 编程时,要以编程方式从函数参数中使用 dplyr vers 中的变量,它们需要被 {{var}} 引用

这很好用,但我想将 lapply 与列表中提供的 var 参数一起使用。这给我一个错误。我曾尝试使用substitutesym 之类的rlang 变量来回尝试,但无济于事。

有什么建议么?谢谢!

library(tidyverse)
tb <- tibble(a = 1:10, b = 10:1)

foo <- function(var, scalar){
  tb %>% mutate(new_var = {{var}}*scalar)
}

foo(a, pi) #works

lapply(X = list(
  list(sym("a"), pi),
  list(substitute(b), exp(1))), FUN = function(ll) foo(var = ll$a, scalar = ll$pi) ) #err

【问题讨论】:

    标签: r dplyr lapply data-masking non-standard-evaluation


    【解决方案1】:

    您可以使用do.call 绕过非标准评估

    lapply(X = list(
      list(var = sym("a"), scalar = pi),
      list(var = substitute(b), scalar = exp(1))), 
      FUN = function(ll) do.call(foo, ll))
    #> [[1]]
    #> # A tibble: 10 x 3
    #>        a     b new_var
    #>    <int> <int>   <dbl>
    #>  1     1    10    3.14
    #>  2     2     9    6.28
    #>  3     3     8    9.42
    #>  4     4     7   12.6 
    #>  5     5     6   15.7 
    #>  6     6     5   18.8 
    #>  7     7     4   22.0 
    #>  8     8     3   25.1 
    #>  9     9     2   28.3 
    #> 10    10     1   31.4 
    #> 
    #> [[2]]
    #> # A tibble: 10 x 3
    #>        a     b new_var
    #>    <int> <int>   <dbl>
    #>  1     1    10   27.2 
    #>  2     2     9   24.5 
    #>  3     3     8   21.7 
    #>  4     4     7   19.0 
    #>  5     5     6   16.3 
    #>  6     6     5   13.6 
    #>  7     7     4   10.9 
    #>  8     8     3    8.15
    #>  9     9     2    5.44
    #> 10    10     1    2.72
    

    创建于 2022-11-03,reprex v2.0.2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2021-01-11
      • 1970-01-01
      • 2018-04-21
      相关资源
      最近更新 更多