2011-03-06 80 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