kjo*_*kjo 4 reduce r vectorization elementwise-operations
我想要一个f这样的功能
(outer(X, Y, f))[i, j]是X的第i个元素和Y的第j个元素的并排连接,类似于c(X[i], Y[j])或具有类似的结构.
此外,我希望这个结果能够重复这个过程,并且通过这种方式,我们得到了这个结果
(outer(outer(X, Y, f), Z, f))[i, j, k]是X的第i个元素,Y的第j个元素和Z的第k个元素的并排串联,即相等或具有类似于的结构c(X[i], Y[j], Z[k]).
最终我的目标是定义这样的函数:
foo <- function(a.list) {
Reduce(function(x, y) outer(x, y, f), a.list)
}
Run Code Online (Sandbox Code Playgroud)
这样,如果
A <- foo(list(v_1, ..., v_p))
Run Code Online (Sandbox Code Playgroud)
那dim(A)将是c(length(v_1), ..., length(v_p)),和
A[i_1, ..., i_p] == c(v_1[i_1], ..., v_p[i_p])
Run Code Online (Sandbox Code Playgroud)
对于所有有效的索引集(i_1,...,i_p).
例如:
> foo(list(LETTERS[1:2], c(3, 4, 5), letters[6:7]))
, , 1
[,1] [,2] [,3]
[1,] c("A", 3, "f") c("A", 4, "f") c("A", 5, "f")
[2,] c("B", 3, "f") c("B", 4, "f") c("B", 5, "f")
, , 2
[,1] [,2] [,3]
[1,] c("A", 3, "g") c("A", 4, "g") c("A", 5, "g")
[2,] c("B", 3, "g") c("B", 4, "g") c("B", 5, "g")
Run Code Online (Sandbox Code Playgroud)
(注意:我不知道上面例子中显示的结果数组是否在R中是有效/可能的,但我使用的表达式c("A", 3, "f")建议'某些类似矢量的对象,其元素为"A", 3,和"f"'.)
我可以使用什么来实现这一目标?
谢谢!
这个功能Vectorize()是你的朋友:定义f为:
f <- Vectorize( function(a,b) c(as.list(a), as.list(b)), SIMPLIFY = FALSE )
Run Code Online (Sandbox Code Playgroud)
然后你可以做(用你foo上面的定义):
z <- foo(list(LETTERS[1:2], c(3, 4, 5), letters[6:7]))
Run Code Online (Sandbox Code Playgroud)
例如,您可以检查条目是否与上面的示例匹配:
> z
, , 1
[,1] [,2] [,3]
[1,] List,3 List,3 List,3
[2,] List,3 List,3 List,3
, , 2
[,1] [,2] [,3]
[1,] List,3 List,3 List,3
[2,] List,3 List,3 List,3
> z[2,2,2]
[[1]]
[[1]][[1]]
[1] "B"
[[1]][[2]]
[1] 4
[[1]][[3]]
[1] "g"
Run Code Online (Sandbox Code Playgroud)