У меня проблемы с оптимизацией части кода R. Следующий пример кода должен проиллюстрировать мою проблему оптимизации:
Некоторые инициализации и определение функции:
a <- c(10,20,30,40,50,60,70,80)
b <- c(“a”,”b”,”c”,”d”,”z”,”g”,”h”,”r”)
c <- c(1,2,3,4,5,6,7,8)
myframe <- data.frame(a,b,c)
values <- vector(length=columns)
solution <- matrix(nrow=nrow(myframe),ncol=columns+3)
myfunction <- function(frame,columns){
athing = 0
if(columns == 5){
athing = 100
}
else{
athing = 1000
}
value[colums+1] = athing
return(value)}
Проблемный цикл for выглядит так:
columns = 6
for(i in 1:nrow(myframe){
values <- myfunction(as.matrix(myframe[i,]), columns)
values[columns+2] = i
values[columns+3] = myframe[i,3]
#more columns added with simple operations (i.e. sum)
solution <- rbind(solution,values)
#solution is a large matrix from outside the for-loop
}
Проблема, по всей видимости, связана с функцией rbind
. Я часто получаю сообщения об ошибках, касающиеся размера solution
, который через некоторое время кажется слишком большим (более 50 МБ). Я хочу заменить этот цикл и rbind
списком и lapply
и / или foreach. Я начал с преобразования myframe
в список.
myframe_list <- lapply(seq_len(nrow(myframe)), function(i) myframe[i,])
На самом деле я не продвинулся дальше этого, хотя я попытался применить это очень хорошее введение в параллельную обработку.
Как мне восстановить цикл for без изменения myfunction
? Очевидно, я открыт для разных решений ...
Изменить: эта проблема кажется прямо из 2-го круга ада из R Inferno < / а>. Какие-либо предложения?
columns
? Я хорошо понимаю,value
- это вектор с двумя возможными значениями: 100 и 1000? - person Adii_   schedule 10.11.2014columns
- это изменяющееся количество столбцовvalues-frame
иsolutions-martrix
. В зависимости от конкретного ввода (в реальном скрипте возможно более 10000 столбцов).myfunction
гораздо сложнее в реальном сценарии. Тем не менее, это просто серия if-ветвей. Каждыйvalues-frame
создается циклом for иmyfunction
и r связывается с матрицейsolutions
. - person user3347232   schedule 10.11.2014solution <- rbind(solution,values)
попробоватьsolution[i,] = values
? Насколько я понимаю, у вас уже естьsolution
матрица, поэтому связывать следующие строки нет необходимости. Изменение существующей строки od NA наvalue
более эффективно. Возможно, это сработает? - person Adii_   schedule 10.11.2014solution
уже создан, но не завершен, поскольку показанный здесь цикл for находится внутри другого цикла for, который полагается наsolution
. - person user3347232   schedule 10.11.2014