Поделитесь немного наборами данных gene
и geno
. В чем проблема? Это медленно? По сравнению с чем?
По крайней мере, ваш l oop подчиняется поведению R копирование при изменении. Используя функцию address
из pryr
, мы видим, что после вызова rbind
ваш объект m
теперь является копией своего прежнего «я»:
library(pryr)
m <- matrix(1:6, nrow = 3, ncol = 2)
address(m)
new_row <- c(8, 9)
m <- rbind(m, new_row)
address(m)
Матрица m меняет адрес после rbind
:
> m <- matrix(1:6, nrow = 3, ncol = 2)
> address(m)
[1] "0x18a0d4737f0"
> new_row <- c(8, 9)
> m <- rbind(m, new_row)
> address(m)
[1] "0x18a0fcb7450"
Это означает, что R создал копию m
, привязал к ней новую строку, присвоил копии имя m
и оставил ее сборщику мусора для удаления. оригинальной версии m
. И он делает это для каждой итерации вашего l oop. Это хорошо известный механизм, почему петли R могут быть медленными. Прочтите от Hadley Wickham здесь для получения дополнительной информации.
Один из возможных выходов - оценить, можно ли заменить функцию, которую использует ваш l oop, векторизованной функцией в R (а их много векторизованные функции).