【问题标题】:Using non-standard evaluation to call an argument in a nested function使用非标准评估调用嵌套函数中的参数
【发布时间】:2020-10-31 04:24:41
【问题描述】:

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

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

但我更特别感兴趣的是如何引用(?)然后解析(?)参数,这里称为“a”或“b”(但函数会在新函数,这里称为“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。我知道这里有很多关于非标准评估的文章,但我尝试过 quote、enquo、bquote、parse/eval、sym、substitute、!!、{{}}、=、:=、assign 以及所有这些的组合没有运气。我的直觉是答案在于指定哪个环境?如果有人知道“ELI5”关于环境的任何好的参考资料,我将不胜感激。谢谢!

【问题讨论】:

  • 你必须使用library(rlang),但是你会得到错误“:=只能在一个准引用的参数中使用”我认为问题是你的函数adder不能处理它的论点以正确的 tidyeval 方式进行,但我还没有找到正确的方式

标签: r arguments non-standard-evaluation


【解决方案1】:

您可以使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多