经验丰富的R开发人员将考虑最有效(但仍然可读)的方法来构造具有来自给定函数的给定数量的行和列的矩阵,例如, A_ij = someFun(i,j),1< = i< = rows,1< = j< = cols?
由于我在文档中找不到任何内容,我想出了
initMatrix <- function(rows, cols, fn) {
A <- matrix(nrow=rows, ncol=cols)
for (i in 1:rows)
for (j in 1:cols)
A[i,j] <- fn(i,j)
return(A)
}
这对我来说似乎很愚蠢。欢迎任何改进(特别是单线)! :)
答案 0 :(得分:7)
我认为您正在寻找outer(seq(rows),seq(cols),fn)
(或按照以下建议,outer(seq_len(rows),seq_len(cols),fn)
:需要一些示例才能看出有多大差异。)
你可以获得很多可读性(至少如果你不必去查找?outer
来查找正在发生的事情),但我实际上并不认为你节省了很多时间。如果你的fn
被矢量化开头,可能会有更聪明,更有效的东西:是吗?
答案 1 :(得分:6)
查看outer
:
> outer (LETTERS [1:3], letters [4:7], paste)
[,1] [,2] [,3] [,4]
[1,] "A d" "A e" "A f" "A g"
[2,] "B d" "B e" "B f" "B g"
[3,] "C d" "C e" "C f" "C g"
答案 2 :(得分:1)
如果您只是编写任何功能,则可能会在调用“外部”时出错,因此请首先对其进行矢量化。
fn <- function(i,j){ ... }
A <- outer(1:rows, 1:cols, Vectorize(fn))
没有向量化的情况下它不会工作的例子:
fn <- function(i,j){
return(prop.test(c(tables[i,1], tables[j,1]), c(sum(tables[i,]), sum(tables[j,])))$p.value)
}