使用tryCatch与R中的Magrittr管道

使用tryCatch与R中的Magrittr管道,r,try-catch,tidyverse,magrittr,R,Try Catch,Tidyverse,Magrittr,我有两个类似的函数要应用于数据帧。每个函数使用数据帧中的两个向量并创建一个新向量。但是,其中一个函数有时会返回错误。最后,我将在for循环中使用它,并计算每个函数给出的错误数(以显示一个函数优于另一个:-)。然而,我不知道我是否理解tryCatch或try足够好地与管道一起使用。下面是一个函数失败的例子 library(tidyverse) # Function that works func_1 <- function(arg1, arg2) { arg1 + ar

我有两个类似的函数要应用于数据帧。每个函数使用数据帧中的两个向量并创建一个新向量。但是,其中一个函数有时会返回错误。最后,我将在for循环中使用它,并计算每个函数给出的错误数(以显示一个函数优于另一个:-)。然而,我不知道我是否理解
tryCatch
try
足够好地与管道一起使用。下面是一个函数失败的例子

library(tidyverse)

# Function that works    
func_1 <- function(arg1, arg2) {
      arg1 + arg2
    }

# Function that errors
    func_2 <- function(arg1, arg2) {
      if(arg1 == 0) {error("Some Error")}
      else arg1 * arg2
    }

# Using the functions with pipes
    cars <- mtcars %>%
      filter(mpg > 18) %>%
      select("vs", "carb") %>%
      mutate(func1 = func_1(vs,carb)) %>%
      mutate(func1 = func_2(vs, carb))
库(tidyverse)
#有效的功能
func_1%
选择(“vs”、“carb”)%>%
突变(func1=func_1(vs,carb))%>%
变异(func1=func_2(vs,carb))

当我用
try
包装mutate时,新的向量/列不会被计算。我无法使用管道使
tryCatch
工作。任何想法或替代方法都将受到欢迎。

可能类似于:

library(tidyverse)

# Function that works    
func_1 <- function(arg1, arg2) {
  arg1 + arg2
}

# Function that errors
func_2 <- function(arg1, arg2) {
  if (arg1 == 0) { error("Some Error") }
  else arg1 * arg2
}

countingly <- function (.f, handle = uuid::UUIDgenerate(), otherwise = NULL, quiet = TRUE) {
  .f <- as_function(.f)
  function(...) {
    ret <- purrr:::capture_error(.f(...), otherwise)
    if (is.null(ret$result)) {
      error_track <<- c(error_track, list(f_hand = handle, f_err = ret$error))
      NA
    } else {
      ret$result
    }
  }
}

s_func_1 <- countingly(func_1, "f1")
s_func_2 <- countingly(func_2, "f2")

error_track <- list()

cars <- mtcars %>%
  filter(mpg > 18) %>%
  select("vs", "carb") %>%
  mutate(func1 = s_func_1(vs, carb)) %>%
  mutate(func2 = s_func_2(vs, carb))
库(tidyverse)
#有效的功能

func_1函数
error_counting
接收一个函数作为参数,返回一个具有相同功能的函数,并将错误时间记录在名为
error_numbers
的列表中。 如果一个功能失败,数据框对应的列将是
NA

library(tidyverse)

# Function that works    
func_1 <- function(arg1, arg2) {
    arg1 + arg2
}

# Function that errors
func_2 <- function(arg1, arg2) {
    if (any(arg1 == 0)) {stop("Some Error")}
    else arg1 * arg2
}

error_numbers <- list()

error_counting <- function(f){
    force(f)
    fname <- as.character(substitute(f))
    error_numbers[[fname]] <<- 0
    count <- function(e){
        error_numbers[[fname]] <<- error_numbers[[fname]] + 1
        NA
    }
    function(...){
        tryCatch(f(...), error = count)
    }
}

e_func_1 <- error_counting(func_1)
e_func_2 <- error_counting(func_2)

# Using the functions with pipes
cars <- mtcars %>%
    filter(mpg > 18) %>%
    select(vs, carb) %>%
    mutate(func1 = e_func_1(vs,carb)) %>%
    mutate(func2 = e_func_2(vs, carb))
库(tidyverse)
#有效的功能

func_1出现错误时,您希望的行为是什么?我将循环许多数据帧,因此每次函数不工作时,它都可以增加一个计数器:
func_2_errors=func_2_errors+1
。如果两个函数都工作,数据框应该有4列,如果一个函数失败,数据框应该有3列,如果两个函数都失败,它应该只有原来的2列。