我有一个复杂的函数,需要一堆图形对象和ggplot贴图并将它们组合成gtables。出于这个问题的目的,我将该函数表示为一个简单的线性函数MyFun1或MyFun2,它们的区别仅在于......参数的存在。
创建gtables的函数有两个不同的参数和一堆在给定运行中不变的其他参数。我试图用mapply运行该函数,使用MoreArgs参数提供常量(对于每次运行 - 在更大的循环中更改)参数。但是,我得到一个错误,说传递的值是多余的,尽管它们在身体中使用。
mArgs <- list(y1=1, y2=2)
MyFun1 <- function(x, y){x*y1 + y*y2}
MyFun2 <- function(x, y, ...){x*y1 + y*y2}
R1 <- function(A, B){
out <- mapply(MyFun, x=A, y=B, MoreArgs = mArgs)
}
R1(1:3, 4:6)
Error in (function (x, y) : unused arguments (y1 = 1, y2 = 2)
回溯:
3. (function (x, y)
{
x * y1 + y * y2
})(x = dots[[1L]][[1L]], y = dots[[2L]][[1L]], y1 = 1, y2 = 2)
2. mapply(MyFun, x = A, y = B, MoreArgs = mArgs)
1. R1(1:3, 4:6)
我想也许问题是MyFun1缺少必要的形式来将额外的参数传递到正文中,所以我尝试添加一个......参数。但现在MyFun无法在MoreArgs列表中找到参数。
R2 <- function(A, B){
out <- mapply(MyFun2, x=A, y=B, MoreArgs = mArgs)
}
R2(1:3, 4:6)
Error in (function (x, y, ...) : object 'y1' not found
回溯:
3. (function (x, y, ...)
{
x * y1 + y * y2
})(x = dots[[1L]][[1L]], y = dots[[2L]][[1L]], y1 = 1, y2 = 2)
2. mapply(MyFun2, x = A, y = B, MoreArgs = mArgs)
1. R2(1:3, 4:6)
然后我想,也许全球环境中的mArgs不在MyFun2的范围内,尽管看起来它应该是我的有限理解。所以我把它作为每个调用函数的参数添加。这并没有改变结果。
R3 <- function(A, B, mArgs){
out <- mapply(function(x,y, ...){x*y1 + y*y2}, x=A, y=B,
MoreArgs = mArgs)
}
R3(1:3, 4:6, mArgs)
Error in (function (x, y, ...) : object 'y1' not found
回溯:
3. (function (x, y, ...)
{
x * y1 + y * y2
})(x = dots[[1L]][[1L]], y = dots[[2L]][[1L]], y1 = 1, y2 = 2)
2. mapply(function(x, y, ...) {
x * y1 + y * y2
}, x = A, y = B, MoreArgs = mArgs)
1. R3(1:3, 4:6, mArgs)
我尝试在每个函数中用列表本身替换mArgs,这在任何情况下都不会改变结果。
我很困惑。救命啊!
答案 0 :(得分:0)
要解决您的问题,您可以:
MyFun2 <- function(x, y, y1, y2){x*y1 + y*y2}
要回答您的方法无效的原因,请参阅dot-dot-dot上的R-lang:
2.1.9点 - 点
'...'对象类型存储为一种类型的pairlist。组件 可以通过C代码以通常的pairlist方式访问'...',但是 不容易作为解释代码中的对象访问。物体 可以作为列表捕获,例如在表1中看到
args <- list(...)
....
for (a in args) {
如果函数将'...'作为形式参数,则任何与形式参数不匹配的实际参数都与'...'匹配。
因此,您需要从y1
手动提取y2
和...
:
MyFun2 <- function(x, y, ...){
additional.args <- list(...)
y1 <- additional.args[[1]]
y2 <- additional.args[[2]]
x*y1 + y*y2
}
MyFun2(1, 2, 1, 2)
# [1] 5
关于moreArgs,它是针对不会被矢量化的参数。见下面的例子:
mapply(function(x, y){
print('----------------')
print(x)
print(y)
x + y
}, x = 1:3, y = 1:3)
# [1] "----------------"
# [1] 1
# [1] 1
# [1] "----------------"
# [1] 2
# [1] 2
# [1] "----------------"
# [1] 3
# [1] 3
# [1] 2 4 6
mapply(function(x, y){
print('----------------')
print(x)
print(y)
x + y
}, x = 1:3, MoreArgs = list(y = 1:3))
# [1] "----------------"
# [1] 1
# [1] 1 2 3
# [1] "----------------"
# [1] 2
# [1] 1 2 3
# [1] "----------------"
# [1] 3
# [1] 1 2 3
# [,1] [,2] [,3]
# [1,] 2 3 4
# [2,] 3 4 5
# [3,] 4 5 6