[英]R: Using the MoreArgs argument in the apply family of functions
我有一個復雜的函數,需要一堆圖形對象和ggplot映射,並將它們組合成gtable。 出於這個問題的目的,我將該函數表示為簡單的線性函數MyFun1或MyFun2,它們的區別僅在於...參數的存在。
創建gtable的函數具有兩個變化的自變量和一堆在給定運行中恆定的其他自變量。 我正在嘗試使用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,在任何情況下都不會改變結果。
我感到困惑。 救命!
要解決您的問題,您可以執行以下操作:
MyFun2 <- function(x, y, y1, y2){x*y1 + y*y2}
要回答您的方法為什么不起作用的原因,請參閱dot-dot-dot上的R-lang:
2.1.9點-點-點
“ ...”對象類型存儲為配對列表類型。 可以從C代碼以通常的成對列表方式訪問'...'的組件,但在解釋代碼中不容易將其作為對象進行訪問。 可以將該對象捕獲為列表,因此例如在表一中可以看到
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.