2010-02-18 38 views
3

我有下面的代碼片段:省略號擴張嵌套函數:錯誤「..三合一不正確的上下文中使用,不......看在」

require(lattice) 
f.barchart <- function(...) { 
    barchart(..., 
     panel = function(x, y, ...) { 
      panel.barchart(x, y, ...) 
     } 
    ) 
} 

x <- data.frame(a = c(1,1,2,2), b = c(1,2,3,4), c = c(1,2,2,1)) 
f.barchart(a ~ b, data = x, groups = c) 

這將導致以下錯誤被拋出:

..3 used in an incorrect context, no ... to look in 

當我使用瞭如下定義:

f.barchart <- function(...) { 
    substitute(barchart(..., 
     panel = function(x, y, ...) { 
      panel.barchart(x, y, ...) 
     } 
    )) 
} 

我得到:

barchart(a ~ b, data = x, groups = c, 
    panel = function(x, y, ...) { 
     panel.barchart(x, y, a ~ b, data = x, groups = c) 
    }) 

我不知道這是否是上述錯誤的原因,但是這將意味着 在panel.barchart省略號被誤用給f.barchart參數的 內容,而非面板擴展 功能。

有沒有辦法避免這個問題?我如何使功能 工作?

+0

我會小心地調用一個變量'c',因爲當你使用'groups = c'時它認爲你的意思是這個函數。但是,這不是你的問題的原因。我發現唯一的一點是,沒有'group = c'參數,一切正常。 – Aniko 2010-02-18 15:19:30

回答

7

據我瞭解,這不是因爲嵌套...而是因爲第一個...條形圖。所以即使這不起作用:

f.barchart <- function(...) { 
    barchart(...) 
} 

x <- data.frame(a = c(1,1,2,2), b = c(1,2,3,4), d = c(1,2,2,1)) 
print(f.barchart(a ~ b, data = x, groups = d)) 

我認爲這是因爲...是一個pairlist,而條形圖期望單獨的參數。我們需要解開pairlist的包裝,同時確保我們不會太快評估它。以下是我的解決方案:

f.barchart <- function(...) { 
    cl<-match.call() 
    cl$panel=function(x, y, ...) { 
      panel.barchart(x, y, ...) 
      } 
    cl[[1]]=barchart 
    eval(cl) 
} 

我們捕捉到的呼叫使用match.call其擴展點來f.barchart,面板參數添加到通話,開啓該功能被稱爲以條形圖,然後評估呼叫。就像我們添加面板參數一樣,我們可以刪除由f.barchart使用但不需要傳遞給條形圖的參數。

+2

非常感謝。我只需要做一些小修改:似乎有必要使用eval.parent而不是eval。我的功能如下所示: f.barchart < - function(...){ cl < - f.merge.list(as.list(match.call()),list(MYOPTIONS)) cl [[1]] =條形圖 eval.parent(as.call(CL)) } 其中f.merge.list是: f.merge.list < - 功能(A,b){ C( a,b [!姓名(b)%姓名(a)]) } – lith 2010-02-19 11:22:43