2017-07-03 16 views
1

に使用すると、データフレームに適用する2つの同様の機能があります。各関数は、データフレームから2つのベクトルを使用し、新しいベクトルを作成します。ただし、関数の1つがエラーを返すことがあります。最終的に、私はforループでこれを使用し、各関数が与えるエラーの数を数えます(ある関数が他の関数より優れていることを示すために):-))。しかし、私がtryCatchまたはtryをパイプで十分に理解できるかどうかはわかりません。以下は、関数が失敗する1つの時間の例です。TryCatchをMagrittrパイプでR

私は、新しいベクトル/列が計算されません tryでのmutateをラップ
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)) 

。私はtryCatchパイプを使用して作業することができません。どのような思考や代替のアプローチが評価されます。おそらく、

+0

エラーが発生した場合の対処方法 – Consistency

+0

私は多くのデータフレームをループするつもりです。関数が動作しなくなるたびに、カウンタをインクリメントすることができます: 'func_2_errors = func_2_errors + 1'。両方の関数が機能する場合、データフレームには4つの列が必要です.1つの関数が失敗した場合、データフレームには3つの列が必要です。両方が失敗した場合は、元の2になります。 –

答えて

1

error_counting関数は、パラメータとしての機能を受け取り、同じ機能を持つ関数を返し、error_numbersと呼ばれるリストにエラー回数を記録します。 1つの関数が失敗すると、データフレームの対応する列は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)) 
0

のようなもの:

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)) 
関連する問題