簡體   English   中英

將 function 名稱作為參數傳遞給 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM