Обнаружение первой итерации (цикла) в R l oop (без счетчика) - PullRequest
0 голосов
/ 06 августа 2020

Я хотел бы обнаружить первую итерацию в al oop внутри функции изнутри тела l oop (т.е. без использования некоторой переменной счетчика, определенной вне l oop), и в

Здесь будет одно базовое c решение, просто для демонстрации идеи:

vect = c('x', 'y', 'z')
for (elem in vect) {
    print(elem)
    isfirst(elem, vect)
}
isfirst = function(ele, vec) {
    if (ele == vec[1]) {
        print('this is the first cycle!')
    } else {
        print('this is NOT the first cycle!')
    }
}

«Проблема» в том, что я хочу, чтобы эта функция была легко повторно использовать в любом l oop: это означает, что ему не нужны аргументы l oop -specifi c, такие как elem и vect. То есть: другой l oop может использовать, например, for (my_item in my_list) et c., И тогда аргументы isfirst необходимо будет соответствующим образом изменить, например isfirst(my_item, my_list). Идеальным способом было бы просто иметь isfirst() без каких-либо аргументов.

Я не уверен, возможно ли это вообще, но приветствую любые идеи.

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

1 Ответ

0 голосов
/ 07 августа 2020

Ну, вот самое близкое, что я смог найти:

vect = c('x', 'y', 'z')
for (elem in enum(vect)) {
    print(elem)
    isfirst()
}

enum = function(vec) {
    assign("first_iteration", TRUE, envir = .GlobalEnv)
    vec = mapply(c, 1:length(vec), vec, SIMPLIFY = FALSE) # this is just a small extra, not related to the question
    return(vec) 
}
isfirst = function() {
    if (first_iteration == TRUE) {
        print('this is the first cycle!')
        assign("first_iteration", FALSE, envir = .GlobalEnv)
    } else {
        print('this is NOT the first cycle!')
    }
}

Но я все еще надеюсь на лучшее решение.

...