使用tryCatch与R中的Magrittr管道
我有两个类似的函数要应用于数据帧。每个函数使用数据帧中的两个向量并创建一个新向量。但是,其中一个函数有时会返回错误。最后,我将在for循环中使用它,并计算每个函数给出的错误数(以显示一个函数优于另一个:-)。然而,我不知道我是否理解使用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
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列。