IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Problèmes de paramétrage fonction R


Sujet :

R

  1. #1
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut Problèmes de paramétrage fonction R
    Bonjour,

    Je suis débutante R, je tente de créer une fonction simple pour comprendre le principe de la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab <- data.frame(age=c(1,2,3),type=c(1,1,1))
    J'enregistre le nouveau dataframe toto, l'équivalent de tab

    Je crée une fonction qui va faire la même chose de manière automatique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    temporal <- function(tableau_out, tableau_in) {tableau_out <<- tableau_in}
    rm(toto)
      temporal (toto,tab)
    Je souhaite que le paramètre tableau_out prenne la valeur de toto et tableau_in, celle de tab. ça ne marche pas. Je n'ai peut-être pas compris le principe d'une fonction en R

    merci à tous pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 34
    Par défaut
    Bonjour,

    Si j'ai bien compris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    temporal = function(tableau_in){
      tableau_out = tableau_in
    }
     
    tableau_out = temporal(tableau_in)
    rm(tableau_in)
    j'espère que ca répond à ta demande
    Prog_R

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    Le problème vient du fait que tableau_out <<- tableau_in veut dire met la valeur de la variable tableau_out dans une variable nommée "tableau_out", et non dans une variable dont le nom est la valeur de la variable tableau_out (ce que tu devais penser). Au final si tu fait ls() tu verras que tu as une variable "tableau_out" qui se créé.

    Si tu viens d'un autre langage de programmation (c++ et dérivés), tu pensait peut être utiliser une référence, mais non, il n'y a pas de référence en R.

    Il faut passer par la fonction "assign" pour faire ce que tu veux.

  4. #4
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut
    Merci pour vos retours. Je viens du monde SAS.

    Merci Theta, je comprends mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    temporal = function(tableau_in){
      tableau_out = tableau_in
    }
     
    tableau_out = temporal(tableau_in)
    rm(tableau_in)
    Je souhaite avoir les 2 paramètres dans la fonction function(tableau_out, tableau_in). Pourquoi avez-vous supprimer tableau_out?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 34
    Par défaut
    Si j'ai bien compris, tu souhaites faire une fonction qui attribue à tableau_out, les valeurs de tableau_in.
    dans la première partie de ta fonction, tu mets les paramètres nécessaire à la réalisation de ta sortie (tableau_out). Je vois pas trop l'intérêt de le mettre dans la fonction si ca dépend uniquement de tableau_in.

    J'ai sans doute pas totalement compris la demande

    Prog_R

  6. #6
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut
    Merci. Mon objectif est de faire une fonction qui prend un dataframe source, fait un filtre et de met le résultat dans un nouveau dataframe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    # Création de 2 data frames sources
    tab_source1 <- data.frame(age=c(1,2,3),type=c(1,1,1))
    tab_source2 <- data.frame(age=c(1,2,3),type=c(1,1,1))
     
    #code non automatisé : filtres sur les dataframes sources et stockage des résultats dans des dataframes résultats
     
    new_tab1 <- tab_source1 %>% dplyr::filter(age>1)
    new_tab2 <- tab_source1 %>% dplyr::filter(age>2)
    new_tab3 <- tab_source1 %>% dplyr::filter(age>3)
     
     
    new_tab1_ <- tab_source2 %>% dplyr::filter(age>1)
    new_tab2_ <- tab_source2 %>% dplyr::filter(age>2)
    new_tab3_ <- tab_source2 %>% dplyr::filter(age>3)
    Comment automatiser le code ci-dessus avec une fonction? Ou placer la fonction assign? Voici ce que j'ai tenté mais ça ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #code automatisé
     
    temporal <- function (data_out,data_in, param_age){
      data_out <- data_in %>% dplyr::filter(age>param_age)
     
    }
     
    temporal (new_tab1,tab_source1,1)
    temporal (new_tab2,tab_source1,2)
    temporal (new_tab3,tab_source1,3)
     
    temporal (new_tab1_,tab_source2,1)
    temporal (new_tab2_,tab_source2,2)
    temporal (new_tab3_,tab_source2,3)
    J'espère être un peu plus clair. Merci encore

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 34
    Par défaut
    à tester:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # Création de 2 data frames sources
    tab_source1 <- data.frame(age=c(1,2,3),type=c(1,1,1))
    tab_source2 <- data.frame(age=c(1,2,3),type=c(1,1,1))
     
    #code non automatisé : filtres sur les dataframes sources et stockage des résultats dans des dataframes résultats
     
    ma_fonction = function(tab_source1, tab_source2){
    new_tab1 = tab_source1[which(tab_source1$age>1),]
    new_tab2 = tab_source1[which(tab_source1$age>2),]
    new_tab3 = tab_source1[which(tab_source1$age>3),]
     
    new_tab1_ = tab_source2[which(tab_source1$age>1),]
    new_tab2_ = tab_source2[which(tab_source1$age>2),]
    new_tab3_ = tab_source2[which(tab_source1$age>3),]
     
    assign(x='new_tab1', value=new_tab1, envir=.GlobalEnv)
    assign(x='new_tab2', value=new_tab2, envir=.GlobalEnv)
    assign(x='new_tab3', value=new_tab3, envir=.GlobalEnv)
    assign(x='new_tab1_', value=new_tab4, envir=.GlobalEnv)
    assign(x='new_tab2_', value=new_tab5, envir=.GlobalEnv)
    assign(x='new_tab3_', value=new_tab6, envir=.GlobalEnv)
    }
    ma_fonction(tab_source1,tab_source2)

    c'est ce que tu recherches ?

    Prog_R

  8. #8
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut
    Bonjour,

    On y est presque.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tab_source1 <- data.frame(age=c(1,2,3),type=c(1,1,1))
     
    temporal <- function (data_out=,data_in=, param_age=){
      data_out <- data_in %>% dplyr::filter(age>param_age)
      assign(x='data_out',value=data_out,envir=.GlobalEnv)
    }
     
    temporal(sortie_toto,tab_source1,2)
    Pourquoi quand j'appelle la fonction, j'ai en sortie une table qui s'appelle "data_out" et non pas sortie_toto? Ceci est un exemple; car je vais faire appel plusieurs fois à la fonction temporal avec des tables en entrée et en sortie avec des noms différents.
    Merci encore pour le temps consacré.

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2017
    Messages : 34
    Par défaut
    j'ai un peu de mal à lire ton code avec cette utilisation de dplyr, en revanche, pour l'intitulé, il suffit de le remplacer dans ton assign x="sortie_toto"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assign(x='sortie_toto',value=data_out,envir=.GlobalEnv)
    on est bon ou toujours pas ?

    Prog_R

  10. #10
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut
    Ce nom est amené à changer, c'est pour cela que je fais une fonction. Automatiser le "assign", juste changer les paramètres comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    temporal <- function (data_out,data_in, param_age){
      data_out <- data_in %>% dplyr::filter(age>param_age)
      assign(x='data_out',value=data_out,envir=.GlobalEnv)
    }
     
    temporal(sortie_toto,tab_source1,1)
    temporal(titi_toto,tab_source1,2)
    temporal(tutu_toto,tab_source1,3)

  11. #11
    Membre Expert
    Inscrit en
    Novembre 2009
    Messages
    707
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 707
    Par défaut Problèmes de paramétrage fonction R
    Bonjour,

    Le plus simple est de faire un return() en fin de fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    > tab_source1 <- data.frame(age=c(1,2,3),type=c(1,1,1))
    > 
    > temporal <- function(data_in, param_age){
    +   data_out <- data_in[which(data_in$age >= param_age),]
    +   return(data_out)
    + }
    > 
    > sortie_toto <- temporal(tab_source1, 1)
    > sortie_toto
      age type
    1   1    1
    2   2    1
    3   3    1
    > titi_toto <- temporal(tab_source1, 2)
    > titi_toto
      age type
    2   2    1
    3   3    1
    > tutu_toto <- temporal(tab_source1, 3)
    > tutu_toto
      age type
    3   3    1
    Cordialement,

    PS : Puisque vous êtes un utilisateur SAS, je vous conseille le document R for SAS and SPSS users et le livre associé.

  12. #12
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    J'ai du mal à voir pourquoi tu veux absolument utiliser assign (ou avant <<-). Il y a certains cas où ça peut se justifier, mais dans 99% des cas c'est à considérer comme une mauvaise pratique de modifier l'environnement global depuis une fonction.

  13. #13
    Membre averti
    Femme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 28
    Par défaut
    Ok, j'ai compris. Merci mgdondon, cela fonctionne. Il m'a fallu du temps mais je viens de comprendre le fonctionnement.

    Merci progR, tes remarques et propositions m'ont permis de comprendre le fonctionnement.

    je sors de SAS et ce n'est pas pareil.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FLASH MX] Problème flash et fonction mail() php
    Par proutcore dans le forum Flash
    Réponses: 7
    Dernier message: 21/05/2007, 12h21
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo