Почему rbind не работает в цикле функций в R - PullRequest
0 голосов
/ 07 сентября 2018

Я рассчитываю процент воздействия для нескольких растров. У меня есть один растр с суммой целых переменных (SUM). Затем у меня есть 9 растров, которые я хочу зациклить и рассчитать процент воздействия (переменные). Я использую функцию, потому что я буду использовать разные входы. Когда функция останавливается, я хочу иметь текстовый файл или все, что можно экспортировать. Я пытался использовать rbind (), но он не работает, он всегда пуст при выполнении функции. Вот код:

Var_Sum_Impact(EU_HS_45_2041_SUM.r[[1]], EU_HS_45_2041_Var_Medi_Steppic.r)

results = data.frame(col1=numeric(), stringsAsFactors=FALSE)

Var_Sum_Impact = function(SUM, Variables) {
  for (i in 1:9){
    Var = cellStats(Variables[[i]], stat='mean')
    Su = cellStats(SUM, stat='mean')
    Perc = Var/(Su/100)
    print(Perc)
    results = rbind(results, Perc)
    }
}

И вот результат, который я получаю из этого отпечатка, но «результаты» пусты (0 баллов). Расчет правильный:

[1] 9.418741
[1] 20.39071
[1] 12.96036
[1] 5.910591
[1] 4.998413
[1] 21.37485
[1] 6.379199
[1] 4.383655
[1] 14.18348

1 Ответ

0 голосов
/ 07 сентября 2018

rbind не работает, как вы ожидаете, потому что вы пытаетесь привязать фрейм данных к вектору.Поэтому вам нужно либо сделать Perc фреймом данных (или сделать результаты векторными и присоединиться к каждой итерации, используя c()).Вам также необходимо вернуть результаты после цикла for.

Я также думаю, что инстанцирующие результаты должны происходить внутри вашей функции

Я думаю, что это должно работать (но не запускать его):

Var_Sum_Impact = function(SUM, Variables) {
  results = data.frame(col1=numeric(), stringsAsFactors=FALSE)
  for (i in 1:9){
    Var = cellStats(Variables[[i]], stat='mean')
    Su = cellStats(SUM, stat='mean')
    Perc = data.frame(col1 = Var/(Su/100), stringsAsFactors = FALSE)
    print(Perc)
    results = rbind(results, Perc)
    }
    results # return results
}
## call this after your function, right?
Var_Sum_Impact(EU_HS_45_2041_SUM.r[[1]], EU_HS_45_2041_Var_Medi_Steppic.r)

Я бы тоже посмотрелдля использования lapply над объектом Variables:

results_l <- lapply(Variables, function(V) {
        Var = cellStats(V, stat='mean')
        Su = cellStats(SUM, stat='mean')
        data.frame(col1 = Var/(Su/100), stringsAsFactors = FALSE)
}) ## produces a list of data frames you can rbind together
results <- do.call(rbind, results_l)
...