问题描述
我试图从简单的函数“加法器”中获取一个参数,然后使用循环来查看增加该参数的效果。
我知道必须有更好的方法,例如构建一个使数据帧更长的单个函数,或者构建一个没有第二个函数的嵌套循环……所以我欢迎那些人!
但是我更特别感兴趣的是如何在报价单中引用(?)然后解析(?)参数,这里称为“ 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输入x
为a * 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)