使用非标准评估调用嵌套函数中的参数
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 输入 x
是 a * 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)
我正在尝试从一个简单的函数“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 输入 x
是 a * 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)