【发布时间】:2017-05-03 10:41:32
【问题描述】:
我有一个复杂的函数,它需要一堆图形对象和 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,但在任何情况下都没有改变结果。
我很困惑。救命!
【问题讨论】:
-
如何在函数 def
MyFun2 <- function(x, y, y1, y2){x*y1 + y*y2}中显式编码额外的变量名称? -
@mt1022 这行得通,如果你把它作为答案,我会接受。但我希望我知道为什么我不能让它与 MoreArgs 论点一起工作。我写了很多我理解的无缘无故不起作用的 R 代码。这很令人沮丧。
标签: r debugging scope arguments parameter-passing