首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mapply和“.”

使用mapply和“.”
EN

Stack Overflow用户
提问于 2016-10-12 08:28:10
回答 2查看 130关注 0票数 2

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

我已将一项职能定义为:

代码语言:javascript
复制
require(dplyr) 
CustomFunc <- function(...,a,b) {
Data %>% 
         mutate (X1 = a * Column1,
                 X2 = b * Column2) %>%
         group_by(...) %>%
         summarise( GrandTotal =sum(X1/X2) )
}

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

代码语言:javascript
复制
CustomFunct(a= 4, b = 7)

或者,例如,这也适用于:

代码语言:javascript
复制
CustomFunct(ColumnHeader1,ColumnHeader2,
            a= 4, b = 7)

这里的关键是要注意,第一个参数...是/是可选的,可以是可变长度的(在这里,我传递ColumnHeader1ColumnHeader2)。

但是,我希望看到a和b的输入数组的笛卡儿联接的CustomFunct结果,例如:

代码语言:javascript
复制
a <- c(3,6,12,24)
b <- c(1,7)

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

代码语言:javascript
复制
inputs <- expand.grid( a = c(3,6,12,24), 
                       b = c(1,7) )

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

代码语言:javascript
复制
mapply(CustomFunct,
       a = inputs$a,
       b = inputs$b)

然而,我想要的是能够将可选的参数...传递给CustomFunct,在我的脑海中会是这样的:

代码语言:javascript
复制
mapply(CustomFunct,
       ... = list(ColumnHeader1,ColumnHeader2),
       a = inputs$a,
       b = inputs$b)

然而,这是行不通的。有人能帮我找到正确的语法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-12 09:50:41

不如使用dplyr代替:

代码语言:javascript
复制
inputs %>% rowwise() %>% do(CustomFunc(ColumnHeader1, a=.$a, b=.$b))
票数 2
EN

Stack Overflow用户

发布于 2016-10-12 08:55:10

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

代码语言:javascript
复制
mapply(CustomFunct,
       ColumnHeader1, ColumnHeader2,
       a = inputs$a,
       b = inputs$b)

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

代码语言:javascript
复制
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所做的操作,并提供两个版本: NSE CustomFunct和标准计算CustomFunct_,然后在后者中使用mapply

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39994368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档