【问题标题】:Using mapply with '...'将 mapply 与 '...' 一起使用
【发布时间】:2016-10-12 08:28:10
【问题描述】:

在 R 中,我试图将可选参数 ... 传递给使用 mapply 的自定义函数,但没有成功。这是我想要做的:

我已经定义了一个函数:

require(dplyr) 
CustomFunc <- function(...,a,b) {
Data %>% 
         mutate (X1 = a * Column1,
                 X2 = b * Column2) %>%
         group_by(...) %>%
         summarise( GrandTotal =sum(X1/X2) )
}

我可以通过例如传递来很好地使用这个函数

CustomFunct(a= 4, b = 7)

或者例如这也有效:

CustomFunct(ColumnHeader1,ColumnHeader2,
            a= 4, b = 7)

这里的关键是要注意第一个参数... 是可选的并且可以是可变长度的(这里我传递ColumnHeader1ColumnHeader2

但是,我希望看到来自 CustomFunct 的结果,用于 a 和 b 的输入数组的笛卡尔连接,例如:

a <- c(3,6,12,24)
b <- c(1,7)

我使用以下方法创建了 ab 的所有组合:

inputs <- expand.grid( a = c(3,6,12,24), 
                       b = c(1,7) )

我可以使用以下代码让CustomFunct 工作

mapply(CustomFunct,
       a = inputs$a,
       b = inputs$b)

然而,我正在寻找的是能够将可选参数 ... 传递给 CustomFunct,在我的脑海中看起来像这样:

mapply(CustomFunct,
       ... = list(ColumnHeader1,ColumnHeader2),
       a = inputs$a,
       b = inputs$b)

但这不起作用。有人可以帮我找到正确的语法吗?

【问题讨论】:

  • 请注意您不应使用require。它默默地吞下错误;请改用library

标签: r dplyr


【解决方案1】:

改用 dplyr 怎么样:

inputs %>% rowwise() %>% do(CustomFunc(ColumnHeader1, a=.$a, b=.$b))

【讨论】:

  • @好主意,在我的 NSE 函数上“开箱即用”
【解决方案2】:

只需删除... = 和列表:

mapply(CustomFunct,
       ColumnHeader1, ColumnHeader2,
       a = inputs$a,
       b = inputs$b)

但是,您的 CustomFunct 在其 ... 参数中使用非标准评估。这本身很好,但mapply 对其所有参数执行标准评估。因此,mapply 会抱怨 ColumnHeader1 不存在。要解决此问题,请使用标准评估 dplyr 函数(在本例中为group_by_):

CustomFunc <- function(..., a, b) {
    Data %>% 
        mutate(X1 = a * Column1,
               X2 = b * Column2) %>%
        group_by_(...) %>%
        summarize(GrandTotal = sum(X1 / X2))
}

mapply(CustomFunct, 'Columnheader1', 'ColumnHeader2',
       a = inputs$a, b = inputs$b)

如果你想继续使用CustomFunct进行非标准评估,你应该做dplyr所做的,并提供两个版本:NSECustomFunct和标准评估CustomFunct_,然后使用mapply和后者。

【讨论】:

  • 如果列表以编程方式传递,则使用do.call
  • 您好 Konrad,根据您的建议,我收到以下错误“mapply 错误(decay_rate,prtf,status,inputs$lookback_periods,inputs$starting_points):找不到对象 'prtf'
  • @Olivier 错误信息表明问题所在,与mapply调用无关;相反,您还没有定义 prtf 对象。
  • 对不起,之前输入错误;使用您的语法时,我收到此错误Error in mapply(CustomFunc, ColumnHeader1, inputs$a, inputs$b) : object 'ColimnHeader1' not found'
  • @Olivier 和以前一样。但我现在看到您正在使用非标准评估,这会改变事情。请继续关注更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2018-10-09
  • 1970-01-01
  • 2021-05-20
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多