使用非标准求值在嵌套函数中调用参数

问题描述

我试图从简单的函数“加法器”中获取一个参数,然后使用循环来查看增加该参数的效果

我知道必须有更好的方法,例如构建一个使数据帧更长的单个函数,或者构建一个没有第二个函数的嵌套循环……所以我欢迎那些人!

但是我更特别感兴趣的是如何在报价单中引用(?)然后解析(?)参数,这里称为“ 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

棺材上的钉子似乎正在使用赋值运算符LHS上的arg_to_change_enquo。我知道这里有很多关于非标准评估的文章,但是我尝试过引用,enquo,bquote,解析/评估,符号,替代,!!,{{}},=,:=,赋值以及所有这些的组合没有运气。我的直觉是答案在于指定哪种环境?如果有人知道关于环境的任何“ ELI5”参考,我将不胜感激。谢谢!

解决方法

您可以使用do.call并传递参数以将其更改为列表。

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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...