2011-03-06 53 views
5

我对dot-dot-dot参数的范围有疑问。考虑以下function`foo =以下电话点点参数的范围

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

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

功能的伟大工程,当我尝试使用样式=“固定”的说法,这需要一个fixedBreaks参数以及,我得到的eval

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

错误(表达式,ENVIR,enclos): 的...列表中不包含2个元素

注意下面的作品完美

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

我suspsect,这已经是与作用域规则,但一直无法把我的手指上。任何对此的帮助将非常感激。

编辑。我修补了一个简单的黑客工具。我认为这是一个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

看起来像'classIntervals'中的一个bug。作者正在尝试使用'match.call' – hadley 2011-03-06 01:56:48

+0

嗯。我应该给包裹的作者发电子邮件,看看他/她可能要说些什么。感谢提示 – Ramnath 2011-03-06 02:07:58

回答

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,通过名称匹配(因为它们具有相同的名称,杜)。

fixedBreaks无法通过位置或名称进行匹配,因此最终出现在点中。

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


编辑:建议的修复,以classIntervals。如果你正在联系作者,然后建议用

fixedBreaks <- list(...)$fixedBreaks 

这是(我认为)他们的意思,并seemes解决愚蠢的错误信息替换线42-43

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

+0

有趣。我需要通过这个工作来吸收正在说的东西! – Ramnath 2011-03-06 22:08:51