【问题标题】:Remove elements in function that cause it to stop in R删除函数中导致它在 R 中停止的元素
【发布时间】:2020-02-24 06:42:55
【问题描述】:

我有两个简单的函数:f1f2假设我们只能访问f2。如何删除 f2 中导致 f1stop 的任何输出并返回其余输出?

我想要的输出显示在代码下方。

# FUNCTION #1:
f1 <- function(...){

   r <- list(...)
   lapply(seq_along(r), function(i) if(r[[i]] == 4) stop("Problem") else r[[i]] + 1)
}

# FUNCTION #2:
f2 <- function(...){

   res <- try(f1(...), silent = TRUE)

  # if any 'res' causes 'stop' remove it, and return the rest!
}

# EXAMPLE:
f2(1, 2, 4)

我想要的输出是:

#[[1]]
#[1] 1

#[[2]]
#[1] 2

【问题讨论】:

    标签: r list function error-handling


    【解决方案1】:

    如果... 输入中的任何一个出现错误,f1 中的逻辑似乎会停止一切。

    所以,在 f2 中,你可以将输入一个一个地输入 f1,正常的输入会得到正确的输出。

    f1 <- function(...){
    
       r <- list(...)
         lapply(seq_along(r), function(i) if(r[[i]] == 4) stop("Problem") else r[[i]] + 1)
    }
    
    # FUNCTION #2:
    f2 <- function(...){
    
       # res <- try(f1(...), silent = TRUE)
      r <- list(...)
      res = lapply(r, function(fluffybunny){
        tmp =try(f1(fluffybunny))
        if(class(tmp) =="try-error") tmp=NULL
        return(tmp)
      })
      # if any 'res' causes 'stop' remove it, and return the rest!
    
      res.remove_error =res[!sapply(res, is.null)]
       return(res.remove_error)
    }
    
    # EXAMPLE:
    result = f2(1, 2, 4)
    #> Error in FUN(X[[i]], ...) : Problem
    
    result
    #> [[1]]
    #> [[1]][[1]]
    #> [1] 2
    #> 
    #> 
    #> [[2]]
    #> [[2]][[1]]
    #> [1] 3
    

    reprex package (v0.3.0) 于 2019 年 10 月 29 日创建


    编辑:从 f2 的输出中删除带有 try-error 的结果。

    【讨论】:

    • 请在我的 R 代码末尾查看我想要的输出?
    • 我认为期望输出与输入具有相同长度是合理的,错误输出可以进一步处理。例如,如果输入 f2(1,2,4,5) 会怎样?根据您想要的输出,它应该输出(2,3,6)。如果您对此表示满意,我可以更新我的答案。
    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2017-02-04
    • 2021-09-03
    相关资源
    最近更新 更多