L'argument par défaut dans la fonction R (argument formel compensée par de multiples arguments)
Question Simple, je l'espère. Je veux écrire un complot de la fonction qui a une valeur par défaut pour l'axe y de l'étiquette si l'utilisateur ne spécifie pas. Je tiens également à permettre à l' ...
argument pour d'autres paramètres de traçage, et de permettre à l'utilisateur de définir ylab
manuellement. Mais je ne peux pas comprendre comment le faire.
# simple scatterplot function with a default ylab
scatter <- function(x,y, ...) {
plot(x, y, ylab="Default y-axis label", ...)
}
# generate data
x <- rnorm(100)
y <- x+rnorm(100)
# use the default
scatter(x,y)
# here I want to use my own label, but I get an error!
scatter(x, y, ylab="New y-axis label")
L'erreur que j'obtiens est:
Error in plot.default(x, y, ylab = "Default y-axis label", ...) :
formal argument "ylab" matched by multiple actual arguments
Je comprends le problème, mais je ne sais pas le meilleur moyen pour résoudre ce problème. Merci pour l'aide!
EDIT: je me rends compte que je peux faire quelque chose comme
scatter <- function(x,y,ylab = "Default y-axis label", ...) {
plot(x, y, ylab= ylab, ...)
}
...mais si je suis en train d'écrire un paquet de soumettre à CRAN, et j'ai beaucoup de options par défaut j'aimerais jouer avec, je ne veux pas avoir de documenter ces standard traçage des arguments parce qu'ils sont utilisés dans ma définition de la fonction.
Vous devez vous connecter pour publier un commentaire.
Essayer de faire ceci à la place:
Élargissant légèrement sur Arun réponse, c'est une esquisse d'un itinéraire à prendre si vous avez de nombreux arguments:
Certains pensait être nécessaires pour décider de la façon dont vous souhaitez gérer la reconnaissance partielle des arguments (si). par exemple, peut-être quelque chose comme ceci:
serait en mesure de gérer la reconnaissance partielle d'arguments.
...
et puis inspectez...
à l'intérieur descatter
et puis en fonction de ce que l'utilisateur est passé, construire un appel approprié pourplot
.do.call
avec la liste des arguments fournis ici résolu le problème à la perfection. Semble comme il y en avait un de moins ick façon de faire cela, mais cela fonctionne bien.Un chemin à l'aide
match.call
pour vérifier siylab
a été spécifié comme argument:Comme mentionné dans le commentaire
list(...)
est plus agréable, pour obtenir les points argument étendu que d'avoir à obtenir tous les arguments formels avecmatch.call
.Vous pouvez également essayer d'utiliser
pmatch
au lieu de%in%
pour la reconnaissance partielle d'arguments....
plus facilement perçus commeargs <- list(...)
à l'intérieur de la fxn?...
puis de le jeter àdo.call
ou quelque chose.J'utilise une fonction pour construire une liste d'arguments. Dans mon cas, je ne se soucient pas partiellement correspondance des noms d'argument, ce qui est bon parce que ce ne le supportent pas.
Un exemple de son utilisation: