![](/img/trans.png)
[英]How to pass arguments to function called from mapply directly OR how to treat vector as argument to function not to mapply
[英]Pass function name as argument in mapply?
我想將 function 名稱作為參數傳遞給 mapply:
f2 <- function(a, b) a + b^2
f <- function(a, b, func) func(a, b)
f(1, 3, f2) ## returns 10
mapply(f2, 1:2, 3) ## returns [1] 10 11
mapply(function(a, b) f(a, b, f2), 1:2, 3) ## returns [1] 10 11
mapply(f, 1:2, 3, f2) ## fails
最后的mapply
調用會產生錯誤
Error in dots[[3L]][[1L]]: object of type 'closure' is not subsettable
有沒有辦法做到這一點?
mapply
假設您要遍歷在第一個 function 之后傳遞的所有向量。 但是您希望每次迭代都使用相同的f2
值。 您可以使用MoreArgs=
參數來做到這一點
mapply(f, 1:2, 3, MoreArgs=list(func=f2))
您對 3 沒有同樣的問題,因為 R 將執行向量循環以將 3 擴展為c(3,3)
以匹配與c(1,2)
相同的長度。 R 中的函數沒有相同的隱式回收行為。 但如果你希望值始終保持不變,最好將它放在MoreArgs
參數中
1)將 function 包裝在一個列表中:
mapply(f, 1:2, 3, list(f2))
## [1] 10 11
2)通常具有 function arguments 的函數使用match.fun
以便可以傳遞 function 或包含其名稱的字符串。 例如, mapply
本身就是這樣做的,所以上面的代碼行同樣可以寫成: mapply("f", 1:2, 3, list(f2))
。 如果f
是這樣寫的,那么我們可以簡單地將f2
的名稱指定為字符串,即"f2"
。
f <- function(a, b, func) {
func <- match.fun(func)
func(a, b)
}
mapply(f, 1:2, 3, "f2")
## [1] 10 11
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.