彼此内部的lapply函数不能按预期工作

时间:2017-10-15 11:45:44

标签: r

我有两个列表,我必须在这些列表中使用git rev-list --reverse something-begin..something-end . | git cherry-pick --stdin for条件作为我的函数。然后我决定使用if函数。我使用lapply函数,但我的代码变得如此困难而且无法工作。如何让我的代码以简单的方式工作。是否有一种不使用许多lapply函数的好方法。

我的代码的想法:

  1. 首先要有一些清单。
  2. 这些列表不需要具有相同的长度,甚至不需要全部lapply
  3. 所以,我的代码检查每个列表。如果是> 0
  4. 如果是> 0则:

  5. 检查第二个列表的值。

  6. 如果值等于特定值,则此值将更改为新值。
  7. 最后的步骤必须应用于我拥有的所有列表。

    这是我的代码:

    该功能给了我> 0

    NULL

    我的功能将包括许多条件将延伸的条件。例如,

    nx <- list(1, 1) ## if my list  > 0 then check it
    x.t <- list(c(2, 3, 4, 4), c(2, 4, 5, 6))  #the list to apply if statement on it. 
    
    lapply(nx, function(x) if (x > 0) {
      do.t <-  lapply(x.t, function(x) { which(x %in% c(2, 7:10))})
      ##check the values of my list.
    
      lapply(nx, function(x){
    
      lapply(1:length(x), function(i){  for (j in 1:x[[i]]){ ## here I would like j from 1 to length of x where x is a list of two elements.
    
          if (x.t[[i]][do.t[[j]]] == 2) ## here I want to have a condition says that, if the element of each list is equal 2 then this element will have the value 2.5.
            x.t[[i]] <- 2.5
        }})})})
    

    等等。

    结果。

        if (x.t[[i]][do.t[[j]]] == 2){
          x.t[[i]] <- 2.5
    }else{ some condition}elese{other condtion}
    

    我的功能非常复杂,因此我提供此示例与我原来的功能非常相似。

1 个答案:

答案 0 :(得分:1)

作为一般功能,将代码分成几部分可能会更好,每一部分只做一件事。
请注意,lapply将整个向量(列表x.t的元素)传递给函数。然后,complicated遍历向量的元素,一次处理一个。

complicated <- function(x){
    for(i in seq_along(x)){
        if(x[i] > 0){
            if(x[i] == 2)
                x[i] <- 2.5
        }
    }
    x
}

x.t.2 <- lapply(x.t, function(x){
    x <- complicated(x)
    x
})

x.t.2
#[[1]]
#[1] 2.5 3.0 4.0 4.0
#
#[[2]]
#[1] 2.5 4.0 5.0 6.0