Choix d'une fonction dans tapply

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Choix d'une fonction dans tapply

Messagepar David Devreker » 18 Déc 2015, 11:06

Bonjour à tous,

Dans une fonction tapply(x,list(y),FUN) , je cherche à donner le choix de la fonction à appliquer via une interface. La fonction est à renseigner dans un tk2entry.
Pour min, max, sum pas de soucis mais pour les quantiles : quantile, probs=(0.1) cela bloque car il semble que le tk2entry renvoie la fonction sous forme de texte avec des guillemets "quantile, probs=0.1", ce qui ne passe pas dans tapply... J'ai un retour comme cela :

Error in get(as.character(FUN), mode = "function", envir = envir) :
objet 'quantile, probs=(0.1)' de mode 'function' introuvable

Comment faire pour renvoyer une expression sans guillemets??? (si c'est bien cela le problème...) J'ai déjà essayer as.name() et gsub(' " ',' ',...) qui ne fonctionnent pas (même message d'erreur).

Merci d'avance,
David

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Choix d'une fonction dans tapply

Messagepar Eric Casellas » 18 Déc 2015, 12:46

Bonjour,

La fonction get permet de recuperer un objet (dont les fonctions) à partir de son nom.

Exemple adapté de la doc de tapply :

Code : Tout sélectionner

require(stats)
groups <- as.factor(rbinom(32, n = 5, prob = 0.4))
tapply(groups, groups, length)
#alternative à partir du nom de la fonction
tapply(groups, groups, get("length"))
Eric

matthieu faron
Messages : 586
Enregistré le : 16 Fév 2011, 11:23

Re: Choix d'une fonction dans tapply

Messagepar matthieu faron » 18 Déc 2015, 13:36

Bonjour,

Je pense que le problème vient plutôt du fait que vous erssayez de passer un argument de la fonction en plus de celle-ci. probs est bien un argument pour quantile ?

Je ne connais pas du tout le tcl/tk mais je verrais deux solutions :
- soit faire deux demande : une pour la fonction, l'autre pour un éventuel argument
- soit ré-écrire soit même à partir de la réponse l'expression que l'on veut évaluer avec un paste et les fonctions parse et eval
Matthieu FARON

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Re: Choix d'une fonction dans tapply

Messagepar David Devreker » 18 Déc 2015, 13:42

@Eric Casellas Merci pour votre réponse,

J'ai testé la fonction get mais cela ne marche toujours pas avec les quantiles.
Pour être plus précis sur la démarche : la fonction entrée dans le tk2entry ressort sous forme

Code : Tout sélectionner

fun.choice <- as.character(tclvalue(fun.c))


fun.c étant :max, min, sum, mean etc..

puis :

Code : Tout sélectionner

tapply(x, list(y, z), fun.c, na.rm=TRUE)


selon votre example je mets donc

Code : Tout sélectionner

tapply(x, list(y, z), get(fun.c), na.rm=TRUE)


c'est toujours ok pour min, max etc... mais pour fun.choice <- c("quantile, probs = (0.9)") j'ai maintenant

Error in get("quantile, probs = (0.9)") :
objet 'quantile, probs = (0.9)' introuvable

Si la démarche n'est pas possible, y a-t-il un autre moyen d'effectuer un calcule de quantile dans un tapply???

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Re: Choix d'une fonction dans tapply

Messagepar David Devreker » 18 Déc 2015, 13:53

@ matthieu faron


Si je prends votre 2ème proposition cela donnerait ? :

Code : Tout sélectionner

New.Tab <- eval(parse(paste0("tapply(x, list(y, z), ", fun.c, ", na.rm=TRUE)")))


Ce code me renvoie : Error in file(filename, "r") : impossible d'ouvrir la connexion

Edit : en fait il manquait juste une petite étape :

Code : Tout sélectionner

new.fun <- paste0("tapply(x, list(y, z), ", fun.c, ", na.rm=TRUE)")
New.Tab <- eval(parse(text=new.fun))


Et cela fonctionne...
Merci à tous

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Re: Choix d'une fonction dans tapply

Messagepar Eric Casellas » 18 Déc 2015, 14:12

Oui à priori le soucis viens du fait que la chaine de caractere contient le nom de la fonction et ses arguments, ma solution était pour un nom de fonction uniquement.
exemple pour prendre en compte les arguments de la fonctions (hypothèses, le nom de la fonction est en 1er et il n'y a que 1 argument):
(à partir de la proposition de matthieu faron ou il faut ajouter text à l'argument de parse sinon il cherche un fichier)

Code : Tout sélectionner

tapply(1:10, 1:10, quantile, probs=(0.9))
fun.c <- "quantile, probs = (0.9)"

#strsplit(fun.c, ",")[[1]][1]
#eval(parse(text=strsplit(fun.c, ",")[[1]][2]))
tapply(1:10, 1:10, strsplit(fun.c, ",")[[1]][1], eval(parse(text=strsplit(fun.c, ",")[[1]][2])))
Eric

David Devreker
Messages : 153
Enregistré le : 17 Oct 2011, 10:08

Re: Choix d'une fonction dans tapply

Messagepar David Devreker » 18 Déc 2015, 14:17

Comme écrit précédemment (vous êtes super rapide à proposer des solutions :-) ) j'ai procédé comme ceci:

Code : Tout sélectionner

new.fun <- paste0("tapply(x, list(y, z), ", fun.c, ", na.rm=TRUE)")
New.Tab <- eval(parse(text=new.fun))


Et cela fonctionne...
Merci à tous


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité