点 - 点参数的范围

时间:2011-03-06 00:01:26

标签: r scoping

我对点 - 点参数的范围有疑问。考虑以下函数`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))

我怀疑这与范围规则有关,但一直无法指责它。对此有任何帮助将非常感激。

EDIT。我拼凑了一个更简单的黑客,使它工作。我认为这是一个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))

我认为Richie对我的问题的回答揭示了为什么我的早期代码无效。但是,我仍然不明白为什么这样做。

1 个答案:

答案 0 :(得分: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)

在你失败的电话中,你有三个参数

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

x通过位置匹配匹配到var(即,因为它在每种情况下都位于签名的第一个位置)。

style通过名称匹配匹配到style(因为它们具有相同的名称,duh)。

fixedBreaks无法通过位置或名称进行匹配,因此最终会以点为单位。

因此省略号包含1个参数,错误“The ... list不包含2个元素”是正确的(如果相当愚蠢)。


编辑:建议修复classIntervals。如果您正在联系作者,请建议更换第42-43行

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

fixedBreaks <- list(...)$fixedBreaks

这是(我认为)他们的意思,并且可以解决这个愚蠢的错误信息。