【问题标题】:Passing quasiquoted arguments within nested functions在嵌套函数中传递准引用参数
【发布时间】:2019-02-03 15:38:16
【问题描述】:

下面我写了一个简单的函数snafu(),它计算一个新变量snafu_var

library(dplyr)

df <- mtcars %>% select(am, cyl) %>% slice(1:5)

snafu <- function(data, var1, var2){
  require(dplyr)

  var1 <- enquo(var1)
  var2 <- enquo(var2)

  data %>% mutate(snafu_var = !!var1 + !!var2)
}

snafu(df, var1 = am, var2 = cyl)

现在我想将snafu() 嵌套在另一个函数foobar() 中,该函数将利用snafu() 创建的变量。

foobar <- function(data, var1, var2) {
  require(dplyr)

  data <- snafu(data, var1, var2)

  data %>% mutate(foo_var = snafu_var + 1)
}

foobar(df, var1 = am, var2 = cyl)

我在两个方面苦苦挣扎(可能相关):

1) foobar() 中的嵌套函数似乎无法访问提供给foobar() 的参数,从而导致错误消息:

Error in mutate_impl(.data, dots) : 
  Evaluation error: object 'am' not found.

2) 一旦我让嵌套函数工作,我如何在函数foobar() 中调用它的输出snafu_var

这只是一个更复杂的嵌套函数的代表,但解决我的问题的关键是函数是嵌套的,嵌套函数snafu()创建的变量被父函数foobar()使用.

【问题讨论】:

    标签: r dplyr quosure quasiquotes


    【解决方案1】:

    在 foobar 中使用 ...:

    foobar <- function(data, ...) {
    
      data <- snafu(data, ...)
    
      data %>% mutate(foo_var = snafu_var + 1)
    }
    

    【讨论】:

    • 如果参数已在 foobar 中明确命名,是否有办法将参数传递给 snafu?在你的 foobar() 版本中,知道哪些参数需要命名是很神秘的。
    猜你喜欢
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2021-03-30
    • 2022-01-21
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多