gpt4 book ai didi

r - 点-点-点参数的范围

转载 作者:行者123 更新时间:2023-12-04 09:38:09 27 4
gpt4 key购买 nike

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

我认为 Richie 对我的问题的回答揭示了为什么我之前的代码无法正常工作。但是,我仍然不明白为什么会这样。

最佳答案

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

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

关于r - 点-点-点参数的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5207672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com