【问题标题】:Scope of dot-dot-dot Argumentsdot-dot-dot 参数的范围
【发布时间】:2011-03-06 00:01:25
【问题描述】:

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

我怀疑这与范围规则有关,但一直无法确定。对此的任何帮助将不胜感激。

编辑。我拼凑了一个更简单的 hack 让它工作。我认为这是一个 match.call 问题,因为 style = 'pretty' 也存在同样的问题。快速浏览一下代码就会发现,这两种风格都是针对这种风格进行 match.call 的,所以这很可能是错误的来源。无论如何,这是我提出的黑客攻击

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 对我的问题的回答为我早期的代码为何无法运行提供了一些线索。但是,我还是不明白为什么会这样。

【问题讨论】:

  • 在我看来就像classIntervals 中的一个错误。作者试图看中match.call
  • 嗯。我应该给包裹的作者发电子邮件,看看他/她可能会说什么。谢谢提示

标签: r scoping


【解决方案1】:

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

这是(我认为)他们的意思,似乎解决了愚蠢的错误信息。

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2011-10-25
    • 1970-01-01
    相关资源
    最近更新 更多