2017-01-31 2 views
1

Я создал простой цикл для вычисления эффективности некоторых имитируемых данных. Он выполняет прекрасно, пока в цикле:неправильный вывод из функции внутри цикла

NSE_cal <- NULL 

for(i in 1:6) { 
Qobs <- flowSummary_NSE1[[i]][[3]] 
Qsim <- flowSummary_NSE1[[i]][[1]] 
object_cal <- NSEsums("NSE") 
NSE_cal <- c(NSE_cal, object_cal) 
} 

#NSE_cal 
#[1] 0.8466699 0.7577019 0.8128499 0.9163561 0.7868013 0.8462228 

Однако, я хочу, чтобы применить эту петлю достаточно несколько раз - мне нужно, чтобы изменить объект flowSummary_NSE# и у меня есть четыре различных типа преобразования для применения. В начале, я поставил петлю внутри функции, только с transformation необходимости быть указаны, например, так:

badFunction <- function(transformation){ 

NSE_cal <- NULL 

for(i in 1:6) { 
    Qobs <- flowSummary_NSE1[[i]][[3]] 
    Qsim <- flowSummary_NSE1[[i]][[1]] 
    object_cal <- NSEsums(transformation) 
    NSE_cal <- c(NSE_cal, object_cal) 
} 
    print(NSE_cal) 
} 

badFunction("NSE") 
# [1] 0.8462228 0.8462228 0.8462228 0.8462228 0.8462228 0.8462228 

Функция имеет точно такую ​​же информацию, введенную как в цикл по себе, за исключением, для по какой-то причине он выводит одно и то же значение для каждого случая i.

Понятно, что я сделал что-то неправильно. Но, насколько я вижу, это должно быть что-то простое в самой функции. Тем не менее, упаковывают это ошибка в другом месте, я прилагаю код, который генерирует необходимые данные и зависимые функции (here)

Любая помощь будет высоко ценится

ответ

1

Вы должны передать объекты в вложенной функции в качестве аргументов ,

В вашем function_NSEsums.r скрипте изменить первую строку в NSEsums <- function(i, Qobs, Qsim) {

В вашем example_script.r изменить код на следующее:

badFunction <- function(transformation){ 

    NSE_cal <- NULL 

    for(i in 1:6) { 
    Qobs <- flowSummary_NSE1[[i]][[3]] 
    Qsim <- flowSummary_NSE1[[i]][[1]] 
    object_cal <- NSEsums(transformation, Qobs = Qobs, Qsim = Qsim) 
    NSE_cal <- c(NSE_cal, object_cal) 
    } 

    print(NSE_cal) 

} 

badFunction("NSE") 

[1] 0.8466699 0.7577019 0.8128499 0.9163561 0.7868013 0.8462228 
+1

Благодарим Вас за время, чтобы посмотреть в зависимых материалов ; Я был уверен, что уже прошел через каждую часть. Решение кажется довольно очевидным сейчас! Я добавлю это в свой список вещей, чтобы попробовать в следующий раз, когда цикл цикла в функции не работает – Visser

+1

Ваш приветствуется. Просто FYI ваша плохая функция не будет выводить 0.846 .. шесть раз, если вы очистили глобальную среду перед ее запуском. Это отвлекало Qobs и Qsim оттуда, следовательно, одно и то же значение каждый раз. –

+1

Это имеет смысл! Я всегда запускал простую петлю перед тем, чтобы подтвердить вывод. Я добавлю это к списку вещей, которые нужно попробовать при устранении неполадок в следующий раз. Спасибо за отличный совет – Visser

Смежные вопросы