如果我有一个对称二元运算符,我想将其应用于列表中的元素对,有没有一种简单的方法可以在 R 中做到这一点?我试过:
A <- list(1,2,3)
mapply(function(x,y) x+y, A,A)
Run Code Online (Sandbox Code Playgroud)
但这只给出了x[n]+y[n]所有内容n=1..N,但我希望x[n]+y[m]所有内容都m=1..n, n=1..N作为列表返回。outer(..)这样做涉及m=1..N, n=1..N冗余计算,所以我想打折它。
请注意,我不需要这个简单示例的解决方案。我需要一个也适用于非数字输入的通用解决方案。我想做的事情是这样的:
mapply(function(set_1, set_2) setequal(intersect(set_1, set_2),  set_3), list_of_sets, list_of_sets)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,加法和交集都是对称的。在第一个示例中,我期望list(3,4,5)从list(1+2,1+3,2+3). 对于第二种情况,我的输入list_of_sets是:
> list_of_sets
[[1]]
numeric(0)
[[2]]
[1] 1
[[3]]
[1] 2
[[4]]
[1] 1 2
[[5]]
[1] 3
[[6]]
[1] 1 3
[[7]]
[1] 2 3
[[8]]
[1] 1 2 3
Run Code Online (Sandbox Code Playgroud)
并set_3作为c(1,2)一个简单的例子。
您可以使用outer-
values <- c(1, 2, 3)
outer(values, values, `+`)
#     [,1] [,2] [,3]
#[1,]    2    3    4
#[2,]    3    4    5
#[3,]    4    5    6
Run Code Online (Sandbox Code Playgroud)
outer也适用于非数字输入。如果您要应用的函数未矢量化,您可以使用Vectorize. 由于OP没有提供示例,我创建了自己的示例。
list_of_sets_1 <- list(c('a', 'b', 'c'), c('a'))
list_of_sets_2 <- list(c('a', 'c'), c('a', 'b'))
fun <- function(x, y) intersect(x, y)
result <- outer(list_of_sets_1, list_of_sets_2, Vectorize(fun))
result
Run Code Online (Sandbox Code Playgroud)