5

dot-dot-dot引数の範囲について質問があります。次の関数を考えてみましょう`foo=

foo <- function(x, ...){
   require(classInt);
   intvl = classIntervals(x, ...);
   return(intvl);
 }

この関数は、次の呼び出しに最適です

x = runif(100, 0, 100);
y1 = foo(x, n = 5, style = 'quantile');
y2 = foo(x, style = 'equal');

しかし、fixedBreaks引数も必要とするstyle ='fixed'引数を使用しようとすると、次のようになります。

y3 = foo(x, style = 'fixed', fixedBreaks = seq(0, 100, 20))

eval(expr、envir、enclos)のエラー:...リストに2つの要素が含まれていません

以下は完全に機能することに注意してください

y5 = classIntervals(x, style = 'fixed', fixedBreaks = seq(0, 100, 20))

これはスコーピングルールと関係があるのではないかと思いますが、指を置くことができませんでした。これに関する助けをいただければ幸いです。

編集。私はそれを機能させるより単純なハックを作り上げました。style ='pretty'にも同じ問題が存在するため、これはmatch.callの問題だと思います。コードをざっと見てみると、これらがそのようなmatch.callが行われる2つのスタイルであることがわかります。したがって、これがエラーの原因である可能性が非常に高くなります。いずれにせよ、これが私の提案したハックです

foo2 <- function(x, ...){
  require(classInt);
  y = list(...); y$var = x;
  intvl = do.call('classIntervals', y);
}

y6 = foo2(x, style = 'fixed', fixedBreaks = seq(0, 100, 20))

私の質問に対するRichieの答えは、私の以前のコードが機能しなかった理由を明らかにしていると思います。しかし、私はまだこれがなぜそうするのか理解していません。

4

1 に答える 1

2

関数内fooでは、省略記号には2つの要素が含まれています。これを確認するには、この変更を呼び出します。

foo <- function(x, ...){
   require(classInt);
   print(list(...))
   intvl = classIntervals(x, ...);
   return(intvl);
 }

呼び出されるclassIntervalsと、引数の一致が異なるため、省略記号が変わります。これがその関数のシグネチャです

 classIntervals(var, n, style = "quantile", rtimes = 3, ...,
    intervalClosure = "left", dataPrecision = NULL)

失敗した呼び出しでは、3つの引数があります

foo(x, style = 'fixed', fixedBreaks = seq(0, 100, 20))

x位置の一致によって一致しますvar(つまり、いずれの場合も署名の最初の位置にあるため)。

style名前の照合を介してstyle、まで照合されます(同じ名前であるため)。

fixedBreaks位置や名前で一致させることができないため、ドットで終わります。

したがって、省略記号には1つの引数が含まれ、「...リストに2つの要素が含まれていません」というエラーは正しいです(かなりばかげている場合)。


編集:に提案された修正classIntervals。著者に連絡している場合は、42〜43行目を置き換えることをお勧めします

mc <- match.call(expand.dots = FALSE)
fixedBreaks <- sort(eval(mc$...$fixedBreaks))

fixedBreaks <- list(...)$fixedBreaks

これは(私が思うに)彼らが意味したことであり、ばかげたエラーメッセージを解決するようです。

于 2011-03-06T21:00:47.157 に答える