【问题标题】:Detecting first iteration (cycle) in R loop (without counter)检测 R 循环中的第一次迭代(循环)(无计数器)
【发布时间】:2020-08-06 16:26:03
【问题描述】:

我想以最灵活的方式从循环体内检测函数内循环中的第一次迭代(即,不使用在循环外定义的一些计数器变量)。

这是一个基本的解决方案,只是为了演示这个想法:

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!')
    }
}

与此有关的“问题”是我希望此函数可以在任何循环中轻松重用:这意味着它不应该需要特定于循环的参数,例如 elem 和 vect。那就是:另一个循环可能使用例如for (my_item in my_list) 等,因此需要相应地修改 isfirst 参数,例如isfirst(my_item, my_list)。理想的方法是只使用 isfirst() 而无需任何参数。

我不确定这是否可行,但我欢迎任何想法。

(关于我为什么需要这个:我只是想为用户提供一个根据迭代是否是第一次而表现不同的函数,并且他们可以在任何循环中灵活使用并且不需要制作即使是改变参数的这个小调整。)

【问题讨论】:

    标签: r loops for-loop iteration


    【解决方案1】:

    嗯,这是我能得到的最接近的:

    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!')
        }
    }
    

    但我仍然希望有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      相关资源
      最近更新 更多