当在矩阵上使用apply时,不能动态修改R中的子例程中的外部变量



这个问题已经困扰我好几天了。假设我有两个矩阵:

matrix_a <- matrix(0, nrow = 3, ncol = 3, 
                   dimnames = list(c("r1", "r2", "r3"), c("c1", "c2", "c3")))
matrix_b <- matrix(c("r1", "r2", "c1", "c2"), nrow = 2, ncol = 2)

我想动态修改函数中的matrix_a:

change_var <- function(x, matrix_a) {
    if(any(rownames(matrix_a) == x[1])  && any(colnames(matrix_a) == x[2])) {
        matrix_a[x[1], x[2]] <- 1
        return (matrix_a)
    }
}
apply(matrix_b, 1, change_var, matrix_a)
然而,

似乎这段代码根本不能改变matrix_a。但matrix_a的预期结果应该是

   c1 c2 c3
r1  1  0  0
r2  0  2  0
r3  0  0  0

如何实现matrix_a动态修改的目标?请给我一个非for循环的解决方案。提前感谢。

您已经知道,<<-assign可用于修改"全局"变量。<<-非常类似于用inherits=TRUE调用assign

…但看起来你是在尝试创建一个矩阵来计算由matrix_b给出的单元格坐标出现的次数?使用table函数可以更有效地完成(没有for循环!)我在matrix_b中添加了一个重复的行来显示它的工作:

matrix_a <- matrix(0, nrow = 3, ncol = 3, 
                   dimnames = list(c("r1", "r2", "r3"), c("c1", "c2", "c3")))
matrix_b <- matrix(c("r1", "r2", "r2", "c1", "c2", "c2"), nrow = 3, ncol = 2)
# Convert matrix_b from 2-d to 1-d indices
row <- match(matrix_b[,1], rownames(matrix_a))
col <- match(matrix_b[,2], colnames(matrix_a))
idx <- row+(col-1)*nrow(matrix_a)
# Then count the number of identical indices using table
matrix_a[sort(unique(idx))] <- table(idx)

matrix_a更新为:

   c1 c2 c3
r1  1  0  0
r2  0  2  0
r3  0  0  0

…当然,如果你只需要在那里放一个1,你不需要调用table:

row <- match(matrix_b[,1], rownames(matrix_a))
col <- match(matrix_b[,2], colnames(matrix_a))
idx <- row+(col-1)*nrow(matrix_a)
matrix_a[idx] <- 1

最新更新