使用非标准评估调用嵌套函数中的参数

Using non-standard evaluation to call an argument in a nested function

我正在尝试从一个简单的函数“adder”中获取一个参数,然后使用一个循环来查看递增该参数的效果。

我知道一定有更好的方法,例如构建一个可以生成更长数据框的函数,或者可能是一个没有第二个函数的嵌套循环...所以我欢迎这些方法!

但我更感兴趣的是如何引用(?)然后解析(?)参数,这里称为“a”或“b”(但函数将声明它们“arg_to_change") 在新函数中,这里称为 "change_of_adder_arguments".

adder <- function(a=1,b=2){
  data.frame(t=1:100) %>% mutate(x=a*t, y=b*2)
  
}

change_of_adder_arguments <- function(arg_to_change) {
  output <- list()
  arg_to_change_enquo <- enquo(arg_to_change)
  for (i in 1:5) {
    output[[i]] <- ggplot(adder(!!arg_to_change_enquo := i), aes(x, y)) + geom_point()
  
  }
  return(output)
}

change_of_adder_arguments(a)
change_of_adder_arguments(b)

错误:mutate() 输入 x 有问题。 x 找不到函数“:=” i 输入 xa * t.

棺材里的钉子似乎在赋值运算符的左轴上使用 arg_to_change_enquo。我知道这里有很多关于非标准评估的文章,但我尝试过 quote、enquo、bquote、parse/eval、sym、substitute、!!、{{}}、=、:=、assign 和组合所有这些都没有运气。我的直觉是答案是指定哪个环境?如果有人知道“ELI5”关于环境的任何好的参考资料,我将不胜感激。谢谢!

您可以使用 do.call 并将参数作为列表传递给 change。

library(ggplot2)

change_of_adder_arguments <- function(arg_to_change) {
  output <- vector('list', 5)
  arg_to_change_string <- deparse(substitute(arg_to_change))
  for (i in 1:5) {
    output[[i]] <- ggplot(do.call(adder, setNames(as.list(i), 
                   arg_to_change_string)), aes(x, y)) + geom_point()
  }
  return(output)
}

plot <- change_of_adder_arguments(b)