在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)这里的关键是要注意,第一个参数...是/是可选的,可以是可变长度的(在这里,我传递ColumnHeader1和ColumnHeader2)。
但是,我希望看到a和b的输入数组的笛卡儿联接的CustomFunct结果,例如:
a <- c(3,6,12,24)
b <- c(1,7)我使用以下方法创建了a和b的所有组合:
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)然而,这是行不通的。有人能帮我找到正确的语法吗?
发布于 2016-10-12 09:50:41
不如使用dplyr代替:
inputs %>% rowwise() %>% do(CustomFunc(ColumnHeader1, a=.$a, b=.$b))发布于 2016-10-12 08:55:10
只需删除... =和列表:
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所做的操作,并提供两个版本: NSE CustomFunct和标准计算CustomFunct_,然后在后者中使用mapply。
https://stackoverflow.com/questions/39994368
复制相似问题