Не можете динамически изменить внешние переменные в подпрограмме в R, в то время как применение применяется к matix? - PullRequest
2 голосов
/ 11 апреля 2011

Эта проблема уже смутила меня на пару дней. Допустим, у меня есть две матрицы:

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? Пожалуйста, предоставьте мне решение не для петли. Заранее спасибо.

1 Ответ

0 голосов
/ 26 июля 2011

Как вы уже знаете, <<- или assign могут использоваться для изменения "глобальной" переменной.<<- очень похоже на вызов assign с inherits=TRUE.

... но, похоже, вы пытаетесь создать матрицу, которая подсчитывает количество вхождений координат ячейки, заданных matrix_b?Это делается более эффективно (без циклов!) С помощью функции table.Я добавил дубликат строки в 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
...