2012-11-22 50 views
4

如果只有一個S4泛型函數的命名參數的方法定義,如預期substitute()作品:替代()在S4

> setGeneric("fS4", function(x, ...) standardGeneric("fS4")) 
> setMethod("fS4", signature("numeric"), 
+  function(x, ...) deparse(substitute(x)) 
+) 
[1] "fS4" 
> fS4(iris[,1]) 
[1] "iris[, 1]" 

但是,如果加上一個額外的命名參數傳遞給方法的定義, substitute()不再返回正確的說法,因爲它是通過:

> setMethod("fS4", signature("numeric"), 
+  function(x, y, ...) deparse(substitute(x)) 
+) 
[1] "fS4" 
> fS4(iris[,1]) 
[1] "x" 

上爲什麼出現這種情況,最重要的是,如何將其周圍工作任何線索?

回答

2

看看

showMethods(fS4, includeDef=TRUE) 

這表明

Function: fS4 (package .GlobalEnv) 
x="numeric" 
function (x, ...) 
{ 
    .local <- function (x, y, ...) 
    deparse(substitute(x)) 
    .local(x, ...) 
} 

是S4實現與簽名,從一般的不同方法是通過修改簽名產生一個「本地」功能的方式,在具有通用簽名的函數中。 substitute然後在錯誤的環境中評估。根本的問題是不相關的S4

> f = function(x) deparse(substitute(x)) 
> g = function(y) f(y) 
> f(1) 
[1] "1" 
> g(1) 
[1] "y" 
> h = function(...) f(...) 
> h(1) 
[1] "1" 

,並在「正確」的環境評估任何企圖將用戶提供的任意結構受挫。