Это неправильный ответ, но может быть хорошим местом для этого обсуждения и понимания внутренней работы R. Такая ошибка возникла раньше в другом пакете, который я использовал.
СначалаОбратите внимание, что простое присвоение матрицы новой переменной сначала не помогает:
> A <- B <-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3)
> r1 <- A %^% 5
> A
[,1] [,2] [,3]
[1,] 691 1926 312
[2,] 2331 6502 1056
[3,] 1116 3108 505
> B
[,1] [,2] [,3]
[1,] 691 1926 312
[2,] 2331 6502 1056
[3,] 1116 3108 505
Я предполагаю, что R пытается быть умным, передавая по ссылке вместо значений.Чтобы действительно заставить это работать, вам нужно сделать что-то, чтобы отличить A от B:
`%m%` <- function(x, k) {
tmp <- x*1
res <- tmp%^%k
res
}
> B <-matrix(c(1,3,0,2,8,4,1,1,1),nrow=3)
> r2 <- B %m% 5
> B
[,1] [,2] [,3]
[1,] 1 2 1
[2,] 3 8 1
[3,] 0 4 1
Каков явный способ сделать это?
Наконец, в коде C для пакета, есть этот комментарий:
- Примечание: x будет изменен!При необходимости вызывающая сторона должна сделать копию
Но я не понимаю, почему R позволяет коду C / Fortran иметь побочные эффекты в глобальной среде.