2010-02-22 6 views
5

Ma question est comment extraire le nom d'une variable d'une fonction qui est appelée dans une autre fonction dans R?Comment extraire le nom d'une variable dans une fonction appelée depuis une autre fonction dans R?

Pour illustrer, voici un exemple:

a <- function(variable) { 

    print(deparse(substitute(variable))) 

    internala(substitute(variable)) 

} 

internala <- function(variableXX) { 

    namex=deparse(substitute(variableXX)) 

    print(namex) 
} 

L'appel de la fonction a donne le résultat suivant:

>a(whatever) 

[1] "whatever" 

[1] "substitute(variable)" 

ce qui signifie que je peux extraire le nom de la whatever variable à partir a, mais pas de internala.

Des commentaires à ce sujet?

Toute aide sera appréciée!

Maria

+0

Juste pour être clair, quel est le comportement que vous voulez? Je devine que vous voulez 'a (peu importe)' imprimer 'what' deux fois? Si vous exécutez aussi 'internala (whatever)', voulez-vous que la sortie soit 'whatever'? Que faire si vous appelez foo <- function (b) {a (b)}; foo (bar)? –

+0

oui, vous l'avez deviné correctement, je veux un (quelconque) imprimer deux fois, internala (quelquechose) pour imprimer quoi que ce soit et, où je suis réellement coincé, c'est exactement ce que vous avez indiqué, si j'ai une autre fonction foo <- function (b) {a (b)}, j'aimerais que foo (bar) imprime la barre deux fois. Est-ce clair? Avez-vous une idée de la façon de faire cela? tnx beaucoup! maria – Maria

+0

Selon le dernier cas, il semble que vous souhaitiez étendre l'expression à l'appel de niveau supérieur, mais pas plus loin? Alors que s'il y avait aussi foo2 <- function (b) {foo (b + 1)} vous voudriez que foo2 (barre) imprime deux fois la barre + 1? –

Répondre

3

Vous pouvez changer a fonction de substituer l'argument d'une fonction internala et eval il:

a <- function(variable) { 
    print(deparse(substitute(variable))) 
    eval(substitute(internala(variable))) # this is only change 
} 

internala <- function(variableXX) { 
    namex=deparse(substitute(variableXX)) 
    print(namex) 
} 

a(whatever) 

Comme hadley suggère son mieux passer directement des noms. Je fais généralement quelque chose comme ça:

a <- function(variable, vname=deparse(substitute(variable))) { 
    print(vname) 
    internala(variable, vname) 
} 

internala <- function(variableXX, namex=deparse(substitute(variableXX))) { 
    print(namex) 
} 

a(whatever) 

Chaque fonction peut être appelée sans passer le nom, mais vous pouvez le remplacer. Par exemple:

a(whatever, "othername") 
1

Voici quelque chose qui fonctionne pour moi. Cependant, je ne suis pas sûr si cela est la solution optimale

a <- function(variable) { 
print(deparse(substitute(variable))) 
my_command <- paste('internala(',substitute(variable),')',sep = '') 
eval(parse(text = my_command)) 
} 

internala <- function(variableXX) { 
namex=deparse(substitute(variableXX)) 
print(namex) 
} 
+0

Upvote parce qu'il semble faire l'affaire sauf pour deux ergots mineurs: 1.) vous devriez déparer le substitut, sinon vous obtiendrez une erreur si vous appelez un (b + 1). 2.) basé sur les commentaires de Maria, vous devrez aussi monter les cadres parents. –

6

Vous êtes mieux de ne pas déconner avec substitut et amis - vous êtes susceptible de créer une fonction qui sera très difficile à programmer contre. Pourquoi ne pas simplement passer explicitement le nom de la variable sous forme de chaîne?

+0

Certainement; travailler avec des noms de chaînes est beaucoup plus simple. – Shane

+0

Cela a été utile (merci), mais à l'intérieur de la fonction, j'ai ensuite dû faire 'var <- get (var_as_string)'. – drstevok

Questions connexes