33

エラーなしでRプログラムを停止する方法はありますか?

たとえば、いくつかの関数を定義する大きなソースがあり、その後に関数への呼び出しがいくつかあります。ある関数を編集して、R環境で関数定義を更新したいのですが、実際には呼び出されません。

変数を定義し、関数定義の直後にプログラムを停止したいjustUpdate場合。TRUE

ReadInput <- function(...) ...
Analyze <- function(...) ...
WriteOutput <- function(...) ...

if (justUpdate)
    stop()
# main body
x <- ReadInput()
y <- Analyze(x)
WriteOutput(y)

関数を呼び出しstop()ましたが、問題はエラーメッセージが出力されることです。

ctrl+cは別のオプションですが、特定の行でソースを停止したいと思います。

q()またはの問題quit()は、Rセッションが終了することですが、Rセッションを開いたままにしておきたいです。

@JoshuaUlrichが提案したように、別のオプションもありますが、ソースが新しい環境で終了するため(つまり、Rプロンプトがではなくbrowser()に変更されるため)、まだ完全ではありません。それでも私たちはそれをやめるために押すことができますが、私は簡単な方法を探しています。Browser[1]>>Q

別のオプションは使用することですif (! justUpdate) { main body }が、それは問題を解決するのではなく、解決することです。

より良いオプションはありますか?

4

11 に答える 11

24

私はここでかなりきちんとした解決策を見つけました。秘訣は、を呼び出す直前にすべてのエラーメッセージをオフにすることstop()です。この機能on.exit()は、エラーメッセージが後で再びオンになることを確認するために使用されます。関数は次のようになります。

stop_quietly <- function() {
  opt <- options(show.error.messages = FALSE)
  on.exit(options(opt))
  stop()
}

最初の行はエラーメッセージをオフにし、古い設定を変数に保存しますopt。この行の後にエラーが発生してもメッセージは出力さstop()れないため、メッセージも出力されません。

Rヘルプによると、

on.exit引数として指定された式を、現在の関数の終了時に実行する必要があるものとして記録します。

現在の関数はであり、が呼び出されるとstop_quietly()終了します。stop()したがって、プログラムが最後に行うことは、以前に呼び出されたときの値にoptions(opt)設定される呼び出しです(おそらく、必ずしもそうとは限りません)。show.error.messagesstop_quietly()TRUE

于 2017-03-22T07:29:14.357 に答える
14

ここのメーリングリストには、関数から表示されるエラーstopQuietlyを基本的に隠す関数を定義する優れたソリューションがありstopます。

stopQuietly <- function(...) {
  blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" "));
  stop(simpleError(blankMsg));
} # stopQuietly()

> stopQuietly()
于 2015-11-25T12:01:44.410 に答える
9

私も同様の問題を抱えており、@ VangelisTasoulasの回答に基づいて、簡単な解決策を得ました。
関数内では、DBが更新されているかどうかを確認する必要があります。そうでない場合は、実行を停止します。

r=readline(prompt="Is DB updated?(y/n)")
Is DB updated?(y/n)n
if(r != 'y') stop('\r Update DB')
Update DB

メッセージの先頭に入れるだけ\rで、メッセージを上書きError:します。

于 2017-06-12T21:10:33.373 に答える
7

あなたは関数を探していますbrowser

于 2013-01-22T22:53:23.753 に答える
5

次の解決策を使用して、エラーなしでRプログラムを停止できます。

if (justUpdate)
    return(cat(".. Your Message .. "))
于 2018-08-24T19:57:00.013 に答える
1

関数returnを終了したい行の何か:

f <- function(x, dry=F) { 
   message("hi1")
   if (dry) return(x)
   message("hi2")
   x <- 2*x 
}
y1 <- f(2) # = 4 hi1 hi2
y2 <- f(2, dry=T) # = 2 hi1
于 2019-11-20T15:31:48.217 に答える
0

2017年3月22日7:29のStibuからの回答に加えて、stop()の一部としてメッセージを書き込みたい場合、このメッセージは書き込まれません。

次の2行を使用する必要があるのは奇妙だと思います。つまり、on.exit(options(options(show ....)))が機能しません。

opt <- options(show.error.messages = F)
on.exit(options(opt))
于 2020-11-24T11:27:15.853 に答える
0

私はこれに対する答えを忘れていたので、それを調べてここに着陸する必要がありました...あなたはあなたの質問の答えへのヒントを投稿しました...

ctrl + cは別のオプションですが、特定の行でソースを停止したいと思います。

エラー、警告、またはメッセージを通知します

rlang::inform("Updated Only")
rlang::interrupt()

于 2021-12-25T22:29:07.517 に答える
0

スクリプトを書いて、それをで実行するのは良いことだと思いましたsource()。スクリプトでは、exitステートメントを特別なクラスのエラーとして書き込みます。このエラーはtryCatch()、メッセージとして取得して送り返すことができます。

exit <- function(..., .cl = NULL) {
  # Use to capture acceptable stop
  cond <- structure(
    list(.makeMessage(...), .cl),
    class = c("exitError", "error", "condition"),
    names = c("message", "call")
  )

  stop(cond)
}

foo <- function() {
  exit("quit here")
  1
}

tryCatch(
  # rather than foo(), you might use source(filename)
  foo(),
  exitError = function(e) message(e$message)
)
#> quit here

reprexパッケージ(v2.0.1)によって2022-01-24に作成されました

于 2022-01-24T14:02:18.207 に答える
-1

if(){} else {}を使用しないのはなぜですか?ほんの数文字です...

f1 <- function(){}
f2 <- function(){}

if (justUpdate) {
} else {
# main body 
}

あるいは

f1 <- function(){}
f2 <- function(){}

if (!justUpdate) {
# main body 
}
于 2019-11-22T07:36:51.820 に答える
-1

以下のコードは、エラーメッセージなしで停止しました。

opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
break
于 2020-12-15T06:08:08.090 に答える