【问题标题】: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 参数一起使用。这给我一个错误。我曾尝试使用substitute 和sym 之类的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