29

モジュールの実行時に未使用の引数が定義されているという事実をソフトウェアに無視させることは可能ですか?

たとえば、とmultiply(a,b)の積を返すモジュールがありaますb。次のようにモジュールを呼び出すと、エラーが発生します。

multiply(a=20,b=30,c=10)

a必要な入力とが指定されているため、これでエラーを返すことは少し不必要に思えbます。この悪い行動を避けることは可能ですか?

簡単な解決策は、指定を停止することcですが、それではRがこのように動作する理由はわかりません。これを解決する別の方法はありますか?

4

7 に答える 7

42

multiplyの定義を変更して、追加の不明な引数を取ります。

multiply <- function(a, b, ...) {
  # Original code
}
于 2012-04-22T17:46:51.497 に答える
12

R.utilsパッケージには、do.callに似たdoCallという関数がありますが、未使用の引数が渡されてもエラーは返されません。

multiply <- function(a, b) a * b

# these will fail
multiply(a = 20, b = 30, c = 10)
# Error in multiply(a = 20, b = 30, c = 10) : unused argument (c = 10)
do.call(multiply, list(a = 20, b = 30, c = 10))
# Error in (function (a, b)  : unused argument (c = 10)

# R.utils::doCall will work
R.utils::doCall(multiply, args = list(a = 20, b = 30, c = 10))
# [1] 600
# it also does not require the arguments to be passed as a list
R.utils::doCall(multiply, a = 20, b = 30, c = 10)
# [1] 600
于 2018-04-20T20:02:05.157 に答える
9

1つのアプローチ(私が想像できないのは良いプログラミング手法です)は、...ある関数で指定された引数を別の関数に渡すために伝統的に使用されているを追加することです。

> multiply <- function(a,b) a*b
> multiply(a = 2,b = 4,c = 8)
Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8)
> multiply2 <- function(a,b,...) a*b
> multiply2(a = 2,b = 4,c = 8)
[1] 8

あなたはここ...で使用されることを意図していることについてもっと読むことができます

于 2012-04-22T17:47:46.133 に答える
7

...関数定義でdots:を使用できます。

myfun <- function(a, b, ...){
  cat(a,b)
}

myfun(a=4,b=7,hello=3)

# 4 7
于 2012-04-22T17:48:48.847 に答える
3

私はあなたと同じ問題を抱えていました。私は議論の長いリストを持っていましたが、そのほとんどは無関係でした。私はそれらをハードコーディングしたくありませんでした。これが私が思いついたものです

library(magrittr)
do_func_ignore_things <- function(data, what){
    acceptable_args <- data[names(data) %in% (formals(what) %>% names)]
    do.call(what, acceptable_args %>% as.list)
}

do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm")
# -9.230675 -10.503509 -10.927077
于 2017-04-06T01:32:07.123 に答える
0

Rには、乗算を非常にうまく行う関数prod()があります。askerが示した例は、エラーを返さずにprod()関数で正常に機能します。

prod(a=20,b=30,c=10)

 # 6000

いずれにせよ、強調表示されたエラーはそれを修正する機会であり、悪い振る舞いではありません。

于 2021-05-17T10:40:11.960 に答える
0

質問に直接対処する回答はすでに多数あり、Rは技術的に熟練した非プログラマーによって使用されることが多いため、エラーが存在する理由を簡単に概説し、抑制の回避策をアドバイスします。

パラメータの数は、関数を定義する重要な側面です。パラメータの数が一致しない場合は、呼び出し元の意図と関数が実行しようとしていることの間に不一致があることを示しています。このため、これはJava、Python、Haskellなどの多くのプログラミング言語でのコンパイルエラーになります。実際、これらの言語の多くでより厳密な型チェックを行うと、型が一致しない場合にもエラーが発生します。

プログラムのサイズが大きくなり、コードが古くなるにつれて、この種の不一致が意図されたものなのか、それとも本物のバグなのかを特定するのが難しくなります。これが、「クリーンなコード」(エラーや警告のない読みやすいコード)のアイデアが、標準的なプロのプログラマーが取り組む標準である理由です。

したがって、不要なパラメータを削除するためにコードを作り直すことをお勧めします。将来的には、自分自身や他の人のために理解してデバッグする方が簡単になります。

もちろん、Rユーザーは寿命が限られた小さなスクリプトで作業することが多く、大規模なソフトウェアエンジニアリングプロジェクトの通常のトレードオフが常に当てはまるとは限らないことを理解しています。たぶん、1週間しか使用されないクイックスクリプトの場合、エラーを抑制するのが理にかなっています。ただし、コードがどのようなものであるかは、執筆時点ではめったに明らかではないことが広く観察されています(そして私自身の経験でも見ています)。オープンサイエンスを追求し、コードとデータを公開している場合、そのコードが将来、他の人に役立つようにして、結果を再現できるようにすることは特に役立ちます。

于 2021-06-02T05:32:15.310 に答える