[英]generalize lapply/map for all permutations of multiple arguments
我想測試具有多個參數的函數 f 是否按需要工作。
f <- function(x1, ..., xm) {...}
我想要做的是指定列表
x1_arguments <- list(x1_1, ..., x1_n1)
...
xm_arguments <- list(xm_1, ..., xm_nm)
並檢查 f 是否適用於 x1, ..., xm 的所有可能組合。
我當然可以
編寫例如一個數據幀,使得行包含 x1, ... xm 參數的可能組合。 然后遍歷行
編寫一個嵌套的 for / lapply 循環
我想讓它更漂亮,因為 1. 創建一個可能很大的對象,這絕對是不必要的,並且 2. 看起來很難看
是否有一個內置的 R 函數可以讓你這樣做,例如一個循環多個列表的通用 lapply 函數?
有一個用於應用多個迭代的內置函數:
mapply()
在你的情況下:
mapply(f, x = x_arguments, y = y_arguments)
您可能需要安排x
和y
以便所有可能的實例組合匹配,但是一旦您這樣做,您就可以使用此功能。
您正在尋找outer
.
outer(1:3, 4:6, FUN=`^`)
# [,1] [,2] [,3]
# [1,] 1 1 1
# [2,] 16 32 64
# [3,] 81 243 729
要獲得矢量格式,請使用
as.vector(outer(1:3, 4:6, FUN=`^`))
# [1] 1 16 81 1 32 243 1 64 729
mapply
基本上只拋出對角線。
mapply(FUN=`^`, 1:3, 4:6)
# [1] 1 32 729
有關更多參數,您可以嘗試expand.grid
。
f <- function(x, y, z) x + y - z
只需將您的參數擴展到所有可能的
組合
排列。
args <- expand.grid(
x1=1:3,
x2=4:6,
xn=7:9)
head(args)
# x1 x2 xn
# 1 1 4 7
# 2 2 4 7
# 3 3 4 7
# 4 1 5 7
# 5 2 5 7
# 6 3 5 7
並將它們解壓到.GlobalEnv
。
list2env(args, envir=.GlobalEnv)
然后你可以使用mapply
。
mapply(f, x1, x2, xn)
# [1] -2 -1 0 -1 0 1 0 1 2 -3 -2 -1 -2 -1 0 -1 0 1 -4 -3
# [21] -2 -3 -2 -1 -2 -1 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.