Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 彼此内部的lappy函数无法按预期工作_R - Fatal编程技术网

R 彼此内部的lappy函数无法按预期工作

R 彼此内部的lappy函数无法按预期工作,r,R,我有两个列表,我必须对这些列表中的函数使用和if条件。然后我决定使用lappy函数。我使用了lappy函数,但我的代码变得非常困难,无法工作。如何使代码以简单的方式工作。有没有一种好方法可以避免使用许多lappy函数 我的代码的想法: 首先,我有一些清单 这些列表不需要全部相同的长度,甚至不需要全部>0 所以,我的代码检查每个列表。是否为>0 如果是>0,则: 检查第二个列表的值 如果值等于特定值,则该值将更改为新值 最后的步骤必须适用于我拥有的所有列表 这是我的密码: 函数给了我NULL nx

我有两个列表,我必须对这些列表中的函数使用
if
条件。然后我决定使用
lappy
函数。我使用了
lappy
函数,但我的代码变得非常困难,无法工作。如何使代码以简单的方式工作。有没有一种好方法可以避免使用许多
lappy
函数

我的代码的想法:

  • 首先,我有一些清单
  • 这些列表不需要全部相同的长度,甚至不需要全部
    >0
  • 所以,我的代码检查每个列表。是否为
    >0
  • 如果是
    >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
        }})})})
    

    我的函数非常复杂,因此我提供的示例与我的原始函数非常相似

    作为一个通用函数,也许最好将代码分成几个部分,每个部分只做一件事。
    请注意,
    lappy
    将整个向量、列表的元素
    x.t
    传递给函数。然后,
    complex
    循环遍历向量的元素,一次处理一个元素

    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
    
    0){
    如果(x[i]==2)
    
    x[i]您正在使用
    i
    ,但没有为其指定任何值。是的,但如何解决此问题。我使用了另一个
    lappy
    ,但不起作用。我不清楚您要做什么。我只想看看我的列表是否为
    >0
    ,然后基于此应用条件。是否要更改相等的值到2到2.5?非常感谢您的帮助。但是,我必须像我一样使用
    for
    和'if'。这是因为我的函数包含许多列表,并且值各不相同。也就是说,
    x.t[[I]]@F.family好的,我将编辑答案以给出一个更复杂的示例。非常感谢。我真的非常感谢您的帮助。我可以将其作为一个函数来完成吗?因为我有一个包装函数,我需要从这些函数中调用值。这将非常复杂。@F.family是的,我相信您可以。调用函数是可能的,甚至是自然的从函数内部。这称为结构化编程:)
    
    [[1]]
    [[1]][[1]]
    [[1]][[1]][[1]]
    NULL
    
    
    [[1]][[2]]
    [[1]][[2]][[1]]
    NULL
    
    
    
    [[2]]
    [[2]][[1]]
    [[2]][[1]][[1]]
    NULL
    
    
    [[2]][[2]]
    [[2]][[2]][[1]]
    NULL
    
    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