2011-10-18 10 views
5

Tratando de entender por qué rownames = FALSO no se transmite de prueba a Test.list?valores predeterminados no se expidan con UseMethod?

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

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

Test(list()) 

Respuesta

5

Solo se transmiten los argumentos reales al método. Cada método S3 puede tener sus propios valores predeterminados diferentes (aunque sería un diseño muy malo).

Usted debe esforzarse por tener los mismos parámetros con los mismos valores por defecto como la función genérica, y luego, posiblemente, algunos parámetros adicionales al final .

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

Test(list()) 
+0

Gracias, Tommy. Esta respuesta confirma lo que estoy viendo, pero me pregunto por qué vemos este comportamiento. No es obvio para mí por qué los parámetros predeterminados no se transmiten? – SFun28

+0

Debido a que está diseñado de esa manera :) ... y de lo contrario es probable que no podía comprobar si hay faltantes ('' rownames) en su método. ... y ahora eres libre de tener otros valores predeterminados (sin embargo, mala idea). – Tommy

+0

gracias! Supongo que es lo que es. Entiendo que tener diferentes valores predeterminados es una mala idea, simplemente no es intuitivo para mí que los valores predeterminados se ignoran. Quizás necesito profundizar más en la función genérica. Parece más intuitiva que cuando se ejecuta UseMethod (...), los parámetros del método combinado (Test.list en este caso) se emparejan con los parámetros de prueba. Aquí estamos diciendo "coincide con todos los parámetros excepto cuando el parámetro tiene un valor predeterminado. Si incumplido, ignorar". Es un poco más complicado dicho de esa manera. =) – SFun28

Cuestiones relacionadas