将列表中的公式传递给 rlang::exec

passing formula in a list to `rlang::exec`

我正在尝试在自定义函数中使用 rlang::exec,我想在其中将附加参数作为列表传递,然后拼接它们。通常这没有任何问题。但是当涉及 formula 参数时,我在执行此例程时遇到问题。

没有名单

library(rlang)

exec(
  .fn = stats::t.test,
  formula = wt ~ am,
  data = mtcars
)
#> 
#>  Welch Two Sample t-test
#> 
#> data:  wt by am
#> t = 5.4939, df = 29.234, p-value = 6.272e-06
#> alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
#> 95 percent confidence interval:
#>  0.8525632 1.8632262
#> sample estimates:
#> mean in group 0 mean in group 1 
#>        3.768895        2.411000

有列表


extra.args <- list(formula = wt ~ am) 

exec(
  .fn = stats::t.test,
  data = mtcars,
  !!!extra.args
)
#> Error in t.test.default(data = structure(list(mpg = c(21, 21, 22.8, 21.4, : argument "x" is missing, with no default

我怎样才能让它工作?

我不确定这是 rlang::exec 的错。问题确实与 S3 调度有关,并且根据第一个参数的 class 调用不同的函数,而不是参数的名称。使用当前的调用方法,您将在公式之前传递 data= 。这也会导致直接调用函数时出现问题

stats::t.test(data=mtcars, formula=wt~am)

解决这个问题的最简单方法是以“自然”顺序传递参数,以便进行正确的 S3 调度

extra.args <- list(formula = wt ~ am) 
exec(
  .fn = stats::t.test,
  !!!extra.args,
  data = mtcars
)

或将公式参数保留为未命名,使其成为第一个未命名参数。

extra.args <- list(wt ~ am) 

exec(
  .fn = stats::t.test,
  data = mtcars,
  !!!extra.args
)