2010-05-25 2 views
2

Dans R, "assign ('x', v)" définit l'objet dont le nom est 'x' sur v. Remplacez 'x' par le résultat de l'application d'une fonction de texte à une variable x. Puis "assigner" montre sa valeur.comment affecter à l'attribut names() de la valeur d'une variable dans R

Malheureusement, "assign (paste ('names (', 'x', ')', sep = ''), v)" échoue. Donc, si 'x' est une variable x, je peux définir sa valeur, mais je ne peux pas lui donner de noms pour ses éléments.

Peut-on contourner ce problème? un tour de parse-eval peut-être? Merci.

+0

Pourriez-vous donner un exemple de x? – Shane

+3

Ne pouvez-vous pas donner des noms à 'v' avant de l'affecter à '' x ''? – Aniko

Répondre

3

Essayez ceci:

assign(paste(names(x),collapse="."), v) 

Utilisez collapse au lieu s'il y a plusieurs noms.

> v <- 1:10 
> names(v) <- letters[1:10] 
> v 
a b c d e f g h i j 
1 2 3 4 5 6 7 8 9 10 
> assign(paste(names(v), collapse=""), v) 
> abcdefghij 
a b c d e f g h i j 
1 2 3 4 5 6 7 8 9 10 
+0

Je ne pense pas que ce soit ce que Tony voulait. Il veut attribuer des noms à une variable dont le nom a été créé dans le programme. – Aniko

3

Dans la forme que vous posez la question il n'y a pas besoin de assign noms. Si vous existez x alors vous faites names(x) <- v. C'est la bonne façon de le faire.

Si votre nom de variable est inconnue (à savoir dynamique créée), vous pouvez utiliser substitute

nm <- "xxx" # name of your variable 
v <- 1:3 # value 
assign(nm,v) # assign value to variable 

w <- c("a","b","c") # names of variable 
eval(substitute(names(x)<-w, list(x=as.symbol(nm)))) 
# Result is 
str(xxx) 
# Named int [1:3] 1 2 3 
# - attr(*, "names")= chr [1:3] "a" "b" "c" 

Mais si vous devez faire ce genre de trucs il y a quelque chose de mal avec le code que vous.

2

La réponse de Marek fonctionne, mais la question d'Aniko est une réponse simple.

nm <- "xxx"; v<- 1:3; names(v) <- c("a","b","c"); assign(nm,v) 

Ceci est la réponse d'Aniko, elle devrait obtenir le crédit.

Le cas d'utilisation de cette classe comporte> 1 classes de requêtes, chacune avec un nom var différent, et chaque classe contenant une requête> 1 sql. Par exemple, un nom de classe de requête de "config_query" avec trois requêtes nommées dans une liste, dites "q1", "q2", "q3". Et d'autres noms de classe de requête. Je veux faire une boucle qui prendra les préfixes de racine (tels que "config" pour "config_query") des noms de classe de requête comme liste, obtiennent leur contenu de recherche, exécute les requêtes, et liste les images de résultat dans varnames de classe de résultat comme "config_result", de sorte que chaque résultat de "config_result" a le même nom que la requête dans "config_query" dont il est le résultat. De manière différente, je souhaite que les noms de classe de résultat et les correspondances de noms correspondants soient libres, avec des préfixes de racine donnés et des requêtes initiales. Utilisation de assign() assigne aux varnames de classe de résultat. J'étais coincé sur la façon de faire les mappages de noms. Merci!

+0

Il semble que vous ayez besoin d'une liste. Comme 'queries = list (config = liste (requête = liste (q1, q2, ...), résultats = ...)' Avec 'assign' vous aurez des problèmes à tout moment, par exemple quand vous voulez changer de nom pour une colonne dans les résultats. – Marek

0

Si le nom de la variable est stocké sous forme de chaîne dans une autre variable (nom_variable), je vais procéder comme suit.

temp <- get(variable_name) 

names(temp)<- array_of_names 

assign(variable_name,temp) 
Questions connexes