2017-04-05 1 views
0

je peux créer une variable de texte, ce cas d'une boucle, où je vais avoir plusieurs x valeursr - obtenir le nom variable après eval/Parse ou obtenir

fx_1 <-function(varname) 
{ 
    print(paste("fx_1|variable:",deparse(substitute(varname)),"| value:",paste(varname,collapse = "@"))) 
} 

sapply(c("var1","var2"),function(x){ 
    assign(paste0("Example_Module_",x,"_IDS"),c("test","with","getevalparse",x)) 
    fx_1(eval(parse(text=paste0("Example_Module_",x,"_IDS")))) 
    fx_1(get(paste0("Example_Module_",x,"_IDS"))) 
}) 

[1] "fx_1|variable: eval(parse(text = paste0(\"Example_Module_\", x, \"_IDS\"))) | value: [email protected]@[email protected]" 
[1] "fx_1|variable: get(paste0(\"Example_Module_\", x, \"_IDS\")) | value: [email protected]@[email protected]" 
[1] "fx_1|variable: eval(parse(text = paste0(\"Example_Module_\", x, \"_IDS\"))) | value: [email protected]@[email protected]" 
[1] "fx_1|variable: get(paste0(\"Example_Module_\", x, \"_IDS\")) | value: [email protected]@[email protected]" 

Cependant, dans ma boucle je vais besoin de passer cette variable à une fonction qui utilise deparse (substitut()) pour nommer les fichiers de sortie, similaire à la fonction fx_1 ci-dessus. J'espérais naïvement récupérer quelque chose que le Example_Module_1_IDS

Example_Module_1_IDS=c("test","with","var") 
fx_1(Example_Module_1_IDS) 
[1] "fx_1|variable: Example_Module_1_IDS | value: [email protected]@var" 

as.symbol ne fonctionne pas non plus, donc je me demandais s'il y a une façon de le faire?

Modifier Ajouté la fonction fx_1 et l'exemple de la boucle

+0

ne se contente pas 'paste0 ("Example_Module_", x, "_ IDS") 'retourner ce que vous voulez? Je suis confus. Habituellement, l'utilisation de 'get/assign' est un indicateur qu'une mauvaise décision de conception R a été prise. Il est beaucoup plus facile d'utiliser des listes nommées. Vous pouvez 'Example_Module_IDS <-list (c (" test "," this "," code "))' et utiliser 'Example_Module_IDS [[1]]' ou 'Example_Module_IDS [[x]]' pour extraire cette liste. – MrFlick

+0

Oui 'paste0 (" Example_Module _ ", x," _ IDS ")' renvoie ce que je voulais, peut-être mon exemple n'était pas complètement clair sans mon 'fx_1' et la boucle. J'ai ajouté ceux-ci maintenant, j'avais mon 'fx_1' plus tôt et j'aimais utiliser la même variable pour les données et les noms de variables (utilisés pour les fichiers de sortie) mais peut-être que je dois faire les choses différemment maintenant. – ecolog

Répondre

1

Je pense vraiment que vous dirigez vers le bas un mauvais chemin ici. Il semble que vous stockiez des informations importantes dans le nom de la variable elle-même, ce qui n'est pas vraiment quelque chose que la plupart des langages de programmation aiment. Mieux vaut séparer le nom de la valeur. Mais si vous êtes dans le contrôle de fx_1, vous pouvez le changer pour prendre la valeur et le nom séparément, et même avoir par défaut à la valeur deparse() pour la plupart des cas « normaux ». Par exemple

fx_1 <-function(var, varname=deparse(substitute(var))) { 
    paste("fx_1|variable:",varname,"| value:",paste(var,collapse = "@")) 
} 
fx_1(x) 
# [1] "fx_1|variable: x | value: [email protected]@3" 
fx_1(get("x"), "x") 
# [1] "fx_1|variable: x | value: [email protected]@3" 

Il n'y a pas de montant get() ou eval() dans un appel de fonction qui changera que la variable « ressemble » à une fonction. Si vous devez manipuler les noms de paramètres, vous devez utiliser une fonction telle que do.call(). Par exemple

sapply(c("var1","var2"),function(x){ 
    varname <- paste0("Example_Module_",x,"_IDS") 
    assign(varname ,c("test","with","getevalparse",x)) 
    do.call("fx_1", list(as.symbol(varname))) 
}) 

qui retourne

                  var1 
"fx_1|variable: Example_Module_var1_IDS | value: [email protected]@[email protected]" 
                     var2 
"fx_1|variable: Example_Module_var2_IDS | value: [email protected]@[email protected]" 

Mais encore une fois, plus commun et plus facile de travailler avec une solution consiste nommé listes

Example_Module_IDS <- Map(function(x) c("test","with","getevalparse",x), c("var1","var2")) 
Example_Module_IDS[["var1"]] 
Example_Module_IDS[["var2"]] 
printnv <- function(n, v) paste("fx_1|variable:",n,"| value:",paste(x,collapse = "@")) 
mapply(printnv, names(Example_Module_IDS), Example_Module_IDS) 
+0

Wow, c'est très instructif, merci d'avoir répondu à ma question. C'est une bonne leçon. Même si @StatnMap répond à ma question littérale, je pense que je devrais plutôt accepter cette réponse pour que les gens à l'avenir choisissent les meilleures pratiques. – ecolog

0

Le plan est donc d'avoir une sortie comme:

"fx_1|variable: Example_Module_var1_IDS | value: [email protected]@[email protected]" 
"fx_1|variable: Example_Module_var1_IDS | value: [email protected]@[email protected]" 

Avec une fonction de deux variables, il est plus facile. (J'ai également supprimé l'impression):

fx_2 <-function(varname, value) 
{ 
    paste("fx_1|variable:", varname, "| value:", paste(value, collapse = "@")) 
} 

sapply(c("var1","var2"), function(x) { 
    value <- c("test","with","getevalparse",x) 
    varname <- paste0("Example_Module_",x,"_IDS") 
    fx_2(varname, value) 
}) 

Et voici la solution avec un paramètre. Je corrigeais le « get » de sorte qu'il semble dans l'environnement parent:

fx_1 <-function(varname) 
{ 
    paste("fx_1|variable:",varname,"| value:", 
     paste(get(varname, envir = parent.frame()),collapse = "@")) 
} 

sapply(c("var1","var2"), function(x) { 
    assign(paste0("Example_Module_",x,"_IDS"), c("test","with","getevalparse",x)) 
    fx_1(paste0("Example_Module_",x,"_IDS")) 
}) 
+0

Ouais, c'est le type de sortie que je veux, mais quand je lance votre code, j'ai 'Erreur dans get (varname): object 'Example_Module_var1_IDS' not found' qui provient de' get' dans 'fx_1' résolvant cette variable n'est pas défini dans la portée de la fonction – ecolog

+0

Probablement un problème avec les environnements. Si je change la fonction pour prendre deux variables, c'est plus facile. J'ai édité ci-dessus. –

+0

Et j'ai encore édité la fonction 'fx_1' pour que' get' prenne la valeur de 'Example_Module_var1_IDS' dans l'environnement parent –