Область применения точка-точка-точка Аргументы - PullRequest
5 голосов
/ 06 марта 2011

У меня вопрос по поводу аргументов точка-точка-точка.Рассмотрим следующую функцию `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');

Но когда я пытаюсь использовать аргумент style = 'fixed', который требуетВ качестве аргумента fixedBreaks я получаю

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))

Я подозреваю, что это как-то связано с правилами области видимости, но я не смог это указать.Любая помощь в этом была бы очень признательна.

РЕДАКТИРОВАТЬ.Я сделал более простой взлом, который заставляет его работать.Я думаю, что это проблема match.call, так как та же проблема существует для style = 'pretty'.Беглый взгляд на код показывает, что это два стиля, для которых создаются такие match.calls, поэтому вполне вероятно, что это источник ошибки.В любом случае, вот мой предложенный взлом

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))

Я думаю, что ответ Ричи на мой вопрос проливает некоторый свет на то, почему мой предыдущий код не работал.Но я до сих пор не понимаю, почему это так.

1 Ответ

2 голосов
/ 07 марта 2011

Внутри функции 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)

При неудачном вызове у вас есть три аргумента

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

Это (я думаю) то, что они имели в виду, и кажется, чтобы решить глупую ошибкусообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...