function - tag - Función de argumentos predeterminados y valores nombrados
the_tags wordpress (2)
De su ejemplo, tenemos la opción de "CORE"
y "ALL"
. Si esas son las dos opciones, entonces las especificamos en la definición de función para el argumento ''members''
. P.ej:
foo <- function(x, members = c("CORE", "ALL")) {
## do something
}
Esa definición de función establece los valores permitidos para el argumento ''members''
, con un valor predeterminado de "CORE"
ya que esta es la primera opción nombrada.
El código que uno usa dentro del cuerpo de la función es match.arg()
, como @Joris ya lo mencionó, pero como hemos configurado la función como arriba, podemos simplemente usar simplemente match.arg(members}
.
Entonces podemos escribir foo
como:
foo <- function(x, members = c("CORE", "ALL")) {
## evaluate choices
members <- match.arg(members)
## do something
print(members)
}
Que usamos así:
> foo()
[1] "CORE"
> foo(members = "CORE")
[1] "CORE"
> foo(members = "ALL")
[1] "ALL"
> foo(members = "3rdRate")
Error in match.arg(members) : ''arg'' should be one of “CORE”, “ALL”
Observe el comportamiento cuando proporcionamos una cadena no incluida en el conjunto de opciones. Recibimos un mensaje de error intuitivo, todo porque configuramos las opciones en los argumentos de la función.
Digamos que tengo una función R en la que los argumentos pueden ser uno de los pocos valores con nombre predefinidos (uno de los cuales es el predeterminado) o un vector de caracteres personalizado. ¿Cómo debo implementar esto sin confiar en los nombres de valores mágicos u otra bandera?
#allow use of predefined subsets or pass their own list
bratPack<-function(members=''CORE'',...){
if (members==''CORE'')
members<-c(''Emilio Estevez'',''Anthony Michael Hall'',''Rob Lowe'',''Andrew McCarthy'',''Demi Moore'',''Judd Nelson'',''Molly Ringwald'',''Ally Sheedy'')
else if (members==''ALL'')
members<-c(''Emilio Estevez'',''Anthony Michael Hall'',''Rob Lowe'',''Andrew McCarthy'',''Demi Moore'',''Judd Nelson'',''Molly Ringwald'',''Ally Sheedy'',''James Spader'',''Robert Downey, Jr.'',''Jon Cryer'', ''John Cusack'', ''Kevin Bacon'', ''Jami Gertz'', ''Mary Stuart Masterson'', ''Matthew Broderick'', ''Sean Penn'', ''Kiefer Sutherland'')
...
}
Usaría un marco de datos constante en algún lugar del paquete:
.mdata <- data.frame(
CORE= c(TRUE,FALSE,TRUE),
OLD = c(TRUE,TRUE,FALSE),
ALL = c(TRUE,TRUE,TRUE),
row.names=c("John Doe", "Jan Janssen", "Piet Peters")
)
bratPack<-function(members=''CORE'',...){
m.tmp <- try(
match.arg(members,names(.mdata),several.ok=T),
silent=T)
if(!is(m.tmp,"try-error"))
members <- rownames(.mdata)[.mdata[[members]]]
print(members)
}
> bratPack(''CORE'')
[1] "John Doe" "Piet Peters"
> bratPack(''Jan Janssen'')
[1] "Jan Janssen"
> bratPack(c("John Doe","Dick Dickers"))
[1] "John Doe" "Dick Dickers"