簡體   English   中英

為多個參數的所有排列概括 lapply/map

[英]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 的所有可能組合。

我當然可以

  1. 編寫例如一個數據幀,使得行包含 x1, ... xm 參數的可能組合。 然后遍歷行

  2. 編寫一個嵌套的 for / lapply 循環

我想讓它更漂亮,因為 1. 創建一個可能很大的對象,這絕對是不必要的,並且 2. 看起來很難看

是否有一個內置的 R 函數可以讓你這樣做,例如一個循環多個列表的通用 lapply 函數?

有一個用於應用多個迭代的內置函數:

mapply()

在你的情況下:

mapply(f, x = x_arguments, y = y_arguments)

您可能需要安排xy以便所有可能的實例組合匹配,但是一旦您這樣做,您就可以使用此功能。

您正在尋找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.

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