web-dev-qa-db-fra.com

Tester si un argument d'une fonction est défini ou non dans R

J'ai une fonction f qui prend deux paramètres (p1 Et p2):

Si pour le paramètre p2 Aucune valeur n'a été transmise à la fonction, la valeur de p1 ^ 2 doit être utilisée à la place. Mais comment puis-je savoir dans la fonction, si une valeur est donnée ou non. Le problème est que la variable p2 N'est pas initialisée s'il n'y avait pas de valeur. Ainsi, je ne peux pas tester si p2 Est NULL.

f <- function(p1, p2) {
    if(is.null(p2)) {
        p2=p1^2
    }
    p1-p2
}

Est-il possible de vérifier si une valeur pour p2 A été transmise à la fonction ou non? (Je n'ai pas pu trouver une fonction isset() - ou des choses similaires.)

56
R_User

Vous utilisez la fonction missing() pour cela.

f <- function(p1, p2) {
    if(missing(p2)) {
        p2=p1^2
    }
    p1-p2
}

Vous pouvez également définir la valeur de p2 sur NULL par défaut. Je préfère parfois cette solution, car elle permet de passer des arguments aux fonctions imbriquées.

f <- function(p1, p2=NULL) {
    if(is.null(p2)) {
        p2=p1^2
    }
    p1-p2
}

f.wrapper <-function(p1,p2=NULL){
    p1 <- 2*p1
    f(p1,p2)
}
> f.wrapper(1)
[1] -2
> f.wrapper(1,3)
[1] -1

EDIT: vous pouvez le faire techniquement avec missing() également, mais vous devrez également inclure une instruction missing() dans f.wrapper.

65
Joris Meys

Je pense que "? Manquant" devrait le faire.

7
mdsumner

Dans un cas comme celui-ci, vous pouvez également utiliser quelque chose comme ceci:

f <- function(p1, p2 = p1 ^ 2) {
    p1-p2
}

Voir la partie sur l'évaluation paresseuse sur http://adv-r.had.co.nz/Functions.html

6
Johan