2017-07-30 12 views
0

を省略記号私の関数である。R:というし、変数にマッチした関数の引数は、ここで

print.log <- function(print.flag = T,...){ 
    if(print.flag) 
    print(paste(as.character(Sys.time()),' - ',...)) 
} 

関数コール:

print.log('listing x files') 

エラーメッセージ: 場合にエラーで(print.flag)プリント(ペースト(as.character(Sys.time())、 " - "、: 引数はここ

論理として解釈ではない値print.flagが保持されます。

Browse[2]> print.flag 
[1] "listing x files" 

省略記号にプッシュしたい文字列が、結局print.flag変数にマッチしていることを理解しています。

私の質問:なぜそれが動作し、どのようにして希望の結果を得ることができますか? (つまり、print.flag変数を明示的に宣言しない限り、すべての関数引数は省略記号になります)

答えて

1

ここでの解決法は実際にはかなり簡単です。

print.log <- function(..., print.flag = T){ 
    if(print.flag) 
    print(paste(as.character(Sys.time()),' - ',...)) 
} 

これは、関数呼び出しの名前のないパラメータが、関数定義で名前が付けられた順序で一致するためです。これは、...に達するまで起こります。これは、名前のない(名前がついていて、言及されていない)すべての引数を貪欲に食います。

print.log("a", "b", "c") 
#> [1] "2017-07-30 05:21:08 - a b c" 

print.log("a", print.flag = F) 

print.log("a", print.flag = T, "b") 
#> [1] "2017-07-30 05:21:08 - a b" 

print.log("a", one = "b", two = "c") 
#> [1] "2017-07-30 05:21:08 - a b c" 

注:おそらく質問しなかったいくつかの質問に答えることができます。 .は、クラスの振る舞いのためにS3で使用されているよう

は、(このアドバイスに従わない多くのベースR機能にもかかわらず)の命名規則として.を使用して注意してください。続きを読むhere

また、人気のあるPythonロギングパッケージのRポートであるloggingパッケージを調べることもできます。これは、 "ロギングレベル"でロギングの環境制御を可能にし、デフォルトのフォーマット(あなたの場合はタイムスタンプを前面に表示するなど)を定義します。

+0

@kamashay私の答えがあなたの問題を解決するなら、あなたの質問が十分に答えられたことを示す答えを受け入れてください。 – cole

+0

素晴らしい答えと素晴らしいコメント。これは確かに問題を解決します。 – kamashay