簡體   English   中英

映射多個未定義的參數

[英]mapply multiple undefined arguments

假設您有一個未定義的列表nr作為函數的可能參數,例如可以選擇以下3個(此示例盡可能簡單,因此矢量存儲在列表中):

a <- list(c(1,2,3,4,5))
b <- list(c(3,6,7,2,1))
c <- list(c(3,9,8))

如果要計算所有三個列表的交集,可以按以下步驟進行:

Map(intersect,c,Map(intersect,a,b))
# or equivalent:
mapply(intersect,c,mapply(intersect,a,b,SIMPLIFY=F))
# [1] 3

但是,如何將參數的nr更改為undefined? 我讀到有關... ,但無法使它正常工作。 第一個想法是編寫一個函數,該函數可以具有由...定義的多個列表參數:

intersectio <- function(...){
  Map(function(...){
    intersect(...)
  })
}

問:但這當然不起作用,因為相交必須遞歸應用。 有什么辦法可以在R中做到這一點嗎?

問題2:這是帶有嵌套列表結構的更新示例。 在這種情況下,如何做到這一點,即將父列表的每個子列表與其他父列表的關聯子列表(相同索引)相交?

a <- list(list(c(1,2,3,4,5)),list(c(3,6,7,2,1)),list(c(3,9,8)))
b <- list(list(c(1,2)),list(c(3,6,9,11,12)),list(c(3)))
c <- list(list(c(1,9)),list(c(65,23,12)),list(c(14,15)))

如@Roland所建議,您可以使用Reduce解決您的問題。 對於平面列表(如問題的第一個版本),可以使用以下內容:

Reduce(intersect, c(a, b, c))

對於嵌套列表(如更新的問題),您只需要將其包裝在mapply調用中:

mapply(function(...) Reduce(intersect, c(...)), a, b, c) 

概括地說,您可以定義一個函數,然后根據需要調用任意數量的參數。

list_intersect <- function(...){
  mapply(function(...) Reduce(intersect, c(...)), ...) 
}
list_intersect(a, b, c)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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