2011-10-18 69 views
5

試圖理解爲什麼rownames = FALSE不會從Test傳遞到Test.list?爲什麼不使用UseMethod分配默認值?

Test = function(object , rownames = FALSE , ...) 
{ 
    UseMethod("Test") 
} 

Test.list = function(object , rownames , ...) 
{ 
    browser() 
    # rownames is missing! 
} 

Test(list()) 

回答

5

只有實際參數傳遞給方法。每個S3方法都可以擁有自己的不同默認值(儘管這可能是一個非常糟糕的設計)。

你應該在年底力爭有相同的參數具有相同的默認值的通用功能,然後可能還有一些額外的參數

# Bad design, but possible to have defaults be different... 
Test.list = function(object , rownames = TRUE , ...) 
{ 
    browser() 
    # rownames is TRUE! 
} 

Test(list()) 
+0

謝謝,湯米。這個答案證實了我所看到的,但我想知道爲什麼我們會看到這種行爲?它對我來說不明顯,爲什麼默認參數不傳遞? – SFun28

+0

因爲它的設計方式:) ...否則,您可能無法檢查您的方法中是否缺少(rownames)。 ...現在你可以自由地擁有其他的默認值(儘管不好的想法)。 – Tommy

+0

謝謝!我想這是它是什麼。我知道有不同的默認值是一個壞主意,它只是不直觀,我忽略了默認值。也許我需要深入研究泛型函數。看起來最直觀的是,當執行UseMethod(...)時,匹配方法(本例中爲Test.list)的參數匹配Test的參數。在這裏,我們說「匹配所有參數,除非參數有默認值,如果默認,忽略」。這種方式稍微複雜一點。 =) – SFun28