将 exec() 与使用 summarize with curly-curly 的函数一起使用
Use exec() with a function that uses summarise with curly-curly
我正在尝试 运行 使用 exec()
这个函数。我有一个使用 rlang::expr
然后 !!
的解决方法,但这意味着更改函数以接受表达式作为参数而不是引用变量。有没有办法在不失去传递引用参数的能力的情况下调用这个函数?
library(tidyverse)
calc_mean <- function(df, col) {
df %>%
summarise(mean({{ col }}))
}
#doesn't work
map(list('calc_mean'), ~exec(.x, df = mtcars, col = mpg))
#> Warning in mean.default(~structure(list(manufacturer = c("audi", "audi", :
#> argument is not numeric or logical: returning NA
#> [[1]]
#> mean(...)
#> 1 NA
由 reprex package (v2.0.1)
于 2022-01-15 创建
我的预期输出与在 exec
外部调用函数相同:
calc_mean(mtcars, mpg)
#> mean(mpg)
#> 1 20.09062
我想你想要遍历一个函数名列表,这只是一个最小的例子(否则就不需要 map
)。
我们可以使用基数 R do.call
,但我们必须 quote
参数并将它们放入列表中:
library(tidyverse)
calc_mean <- function(df, col) {
df %>%
summarise(mean({{ col }}))
}
map(list("calc_mean"), ~ do.call(.x, list(df = quote(mtcars), col = quote(mpg))))
#> [[1]]
#> mean(mpg)
#> 1 20.09062
另一种可能的方法是使用 get
或 mget
(如果你有一个函数名称向量)然后我们可以做一些疯狂的事情。我们只是在您的 lambda 函数中调用 .x
作为函数。不需要 list
或 quote
。最好指定 get
的 envir
参数,我在下面的最小示例中跳过了它:
map(list(get("calc_mean")), ~ .x(df = mtcars, col = mpg))
#> [[1]]
#> mean(mpg)
#> 1 20.09062
由 reprex package (v0.3.0)
创建于 2022-01-15
我正在尝试 运行 使用 exec()
这个函数。我有一个使用 rlang::expr
然后 !!
的解决方法,但这意味着更改函数以接受表达式作为参数而不是引用变量。有没有办法在不失去传递引用参数的能力的情况下调用这个函数?
library(tidyverse)
calc_mean <- function(df, col) {
df %>%
summarise(mean({{ col }}))
}
#doesn't work
map(list('calc_mean'), ~exec(.x, df = mtcars, col = mpg))
#> Warning in mean.default(~structure(list(manufacturer = c("audi", "audi", :
#> argument is not numeric or logical: returning NA
#> [[1]]
#> mean(...)
#> 1 NA
由 reprex package (v2.0.1)
于 2022-01-15 创建我的预期输出与在 exec
外部调用函数相同:
calc_mean(mtcars, mpg)
#> mean(mpg)
#> 1 20.09062
我想你想要遍历一个函数名列表,这只是一个最小的例子(否则就不需要 map
)。
我们可以使用基数 R do.call
,但我们必须 quote
参数并将它们放入列表中:
library(tidyverse)
calc_mean <- function(df, col) {
df %>%
summarise(mean({{ col }}))
}
map(list("calc_mean"), ~ do.call(.x, list(df = quote(mtcars), col = quote(mpg))))
#> [[1]]
#> mean(mpg)
#> 1 20.09062
另一种可能的方法是使用 get
或 mget
(如果你有一个函数名称向量)然后我们可以做一些疯狂的事情。我们只是在您的 lambda 函数中调用 .x
作为函数。不需要 list
或 quote
。最好指定 get
的 envir
参数,我在下面的最小示例中跳过了它:
map(list(get("calc_mean")), ~ .x(df = mtcars, col = mpg))
#> [[1]]
#> mean(mpg)
#> 1 20.09062
由 reprex package (v0.3.0)
创建于 2022-01-15