我对点 - 点参数的范围有疑问。考虑以下函数`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对我的问题的回答揭示了为什么我的早期代码无效。但是,我仍然不明白为什么这样做。
答案 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
这是(我认为)他们的意思,并且可以解决这个愚蠢的错误信息。