web-dev-qa-db-fra.com

Arguments par défaut de la fonction et valeurs nommées

Disons que j'ai une fonction R dans laquelle les arguments peuvent être l'une des quelques valeurs nommées prédéfinies (dont l'une est la valeur par défaut) ou un vecteur de caractères personnalisé. Comment dois-je implémenter cela sans compter sur des noms de valeurs magiques ou un autre indicateur?

#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')
  ...
}
49
Jeremy Leipzig

Dans votre exemple, nous avons le choix entre "CORE" Et "ALL". Si ce sont les deux options, alors nous les spécifions dans la définition de fonction pour l'argument 'members'. Par exemple.:

foo <- function(x, members = c("CORE", "ALL")) {
    ## do something
}

Cette définition de fonction définit les valeurs autorisées pour l'argument 'members', Avec une valeur par défaut de "CORE" Car il s'agit de la première option nommée.

Le code que l'on utilise dans le corps de la fonction est match.arg(), comme @Joris l'a déjà mentionné, mais parce que nous avons configuré la fonction comme ci-dessus, nous pouvons simplement utiliser simplement match.arg(members) .

On peut donc écrire foo comme:

foo <- function(x, members = c("CORE", "ALL")) {
    ## evaluate choices
    members <- match.arg(members)
    ## do something
    print(members)
}

Que nous utilisons comme ceci:

> 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”

Notez le comportement lorsque nous fournissons une chaîne non incluse dans l'ensemble d'options. Nous obtenons un message d'erreur intuitif, tout cela parce que nous avons configuré les options dans les arguments de la fonction.

61
Gavin Simpson

J'utiliserais une trame de données constante quelque part dans le package:

.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"
10
Joris Meys