2 votes

Désactiver l'identification partielle du nom des arguments de la fonction

J'essaie de créer une fonction dans R qui produit un cadre de données de manière standard, mais qui permet également à l'utilisateur d'avoir les colonnes personnalisées qu'il juge nécessaires (le but est de créer un format de données pour les données paléomagnétiques, pour lesquelles il y a des informations communes que tout le monde utilise, et d'autres plus inhabituelles que l'utilisateur pourrait vouloir garder dans le format).

Cependant, je me suis rendu compte que si l'utilisateur souhaite que l'en-tête de ses données soit un préfixe de l'un des arguments définis de la fonction de formatage des données (par exemple, via l'argument 'sheep', qui est un préfixe de l'argument 'sheepc', voir l'exemple ci-dessous), la fonction l'interprète comme l'argument défini (par l'identification partielle du nom, voir http://adv-r.had.co.nz/Functions.html#lexical-scoping pour plus de détails).

Existe-t-il un moyen d'empêcher cela, ou au moins d'avertir l'utilisateur qu'il ne peut pas utiliser ce nom ?

PS : je réalise que cette question est similaire à Désactivation des noms de variables partiels dans les cadres de données de sous-ensembles mais j'aimerais éviter de jouer avec les options des futurs utilisateurs de ma fonction.

fun <- function(sheeta = 1, sheetb = 2, sheepc = 3, ...)
{

  # I use the sheeta, sheetb and sheepc arguments for computations 
  # (more complex than shown below, but here thet are just there to give an example)

  a <- sum(sheeta, sheetb)

  df1 <- data.frame(standard = rep(a, sheepc))

  df2 <- as.data.frame(list(...))

  if(nrow(df1) == nrow(df2)){

    res <- cbind(df1, df2)

    return(res)

  } else {

    stop("Extra elements should be of length ", sheep)

  }

}

fun(ball = rep(1,3))
#>   standard ball
#> 1        3    1
#> 2        3    1
#> 3        3    1

fun(sheep = rep(1,3))
#> Error in rep(a, sheepc): argument 'times' incorrect

fun(sheet = rep(1,3))
#> Error in fun(sheet = rep(1, 3)) : 
#>  argument 1 matches multiple formal arguments

4voto

Roland Points 37641

De la définition de la langue :

Si les arguments formels contiennent "...", la correspondance partielle n'est possible que dans les cas suivants appliquée qu'aux arguments qui la précèdent.

fun <- function(..., sheeta = 1, sheetb = 2, sheepc = 3)
{<your function body>}

fun(sheep = rep(1,3))
#  standard sheep
#1        3     1
#2        3     1
#3        3     1

Bien entendu, votre fonction doit comporter des vérifications d'assertion pour les paramètres non... (cf. help("stopifnot") ). Vous pouvez également envisager d'ajouter un . o _ à leurs étiquettes afin de réduire les risques de collision de noms.

Edit :

"Serait-il possible d'obtenir le même effet sans avoir le ... au début ?"

Oui, voici un exemple rapide avec un seul paramètre :

fun <- function(sheepc = 3, ...)
{ 
  stopifnot("partial matching detected" = identical(sys.call(), match.call()))
  list(...)
}

fun(sheep = rep(1,3))
# Error in fun(sheep = rep(1, 3)) : partial matching detected 

fun(ball = rep(1,3))
#$ball
#[1] 1 1 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X