2016-12-04 16 views
6

Rでは、呼び出し関数を終了して値を返す方法がありますか? return()のようなものですが、親機能からですか?R:呼び出し関数の終了

parent <- function(){ 
    child() 
    # stuff afterward should not be executed 
} 

child <- function(){ 
    returnFromParent("a message returned by parent()") 
} 

stop()はそういうことをしているようです。私がしたいのはstop()の小さな置換えを書いて、stop()stderrに書き込むというメッセージを返します。 G5Wの提案後

更新:テストが失敗した場合、私はそれぞれstop()その結果、チェックの数が多いが、以前のチェックが失敗した場合、後続の条件を評価することができないので、関数が失敗した後に終了しなければなりません1。これを「正しく」実行するには、私が避けたかった巨大なif else構成を構築しなければなりません。

+1

子にステータスフラグを含む構造体を返させることができます。ステータスが1つの場合、親は続行されます。別のステータスでは、親は終了する – G5W

+0

私はそれが良い考えである方法を見ていない。子関数の親の呼び出しを論理的に不透明にする可能性があります。それは、隠れたgotoの声明のようになります。 @ G5Wの考えは有望に見え、はるかに論理的です。 –

+0

これをやりたい理由を説明するために質問を更新しました。 – chris

答えて

5

私はこのようなものを探していたと思います。

parent <- function(){ 
    parent_killing_child() 
    print("do not run this") 
} 

parent_killing_child <- function(){ 
    do.call(return, list("my message"), envir = sys.frame(-1)) 
} 

parent() 

ありがとうございました。

+1

これはきれいです..子関数を 'do.call(return、list(" my message ")、envir = as.environment(sys.frames()[[1]])')コールスタックの任意の深さでそれを持つことができます.. –

1

親機能については、テストのリストを作成してください。その後、テストをループし、失敗した最初のテストでメッセージを返します。その後のテストは、最初の失敗後には実行されません。

サンプルコード:

test1 <- function(){criteria <- T; return(ifelse(criteria,T,F))} 

test2 <- function(){criteria <- F; return(ifelse(criteria,T,F))} 

test3 <- function(){criteria <- T; return(ifelse(criteria,T,F))} 

parent <- function() { 
    tests <- c('test1', 'test2', 'test3') 
    for (i in 1:length(tests)) { 
    passed <- do.call(tests[i],args = list()) 
    #print(passed) 
    if (!passed){ 
     return(paste("Testing failed on test ", i, ".", sep='')) 
    } 
    } 
    return('Congrats! All tests passed!') 
} 

parent() 
2

免責事項:これはスクリプトであれば、それは、問題になることはありませんインタラクティブ場合、stdoutに停止メッセージが無価値にいくつか持っている印刷、XYの問題を聞こえるだけ通常のリダイレクト2 > &1を使用して、stderrメッセージをstdoutに書き込んでください。this questionのようにsinkと答えてください。

私が正しく理解していれば、あまりにも多くのコードリファクタリングを避けるために、次のようなことをします。

まずエラーを処理するための関数を定義します。

my_stop <- function() { 
e <- geterrmessage() 
print(e) 
} 

は、今すぐあなたの関数に(エラーハンドラ)エラーを送信し、エラーメッセージを抑制するために、システムを構成:

options(error = my_stop) 
options(show.error.messages=FALSE) 

今度はそれをテストしてみましょう:

f1 <- function() { 
    f2() 
    print("This should not be seen") 
} 

f2 <- function() { 
    stop("This is a child error message") 
} 

出力:

> f1() 
[1] "Error in f2() : This is a child error message\n" 
関連する問題