web-dev-qa-db-fra.com

Comment nommer des variables à la volée?

Est-il possible de créer de nouveaux noms de variables à la volée?

J'aimerais lire les données d'une liste dans de nouvelles variables avec des nombres à la fin. Quelque chose comme orca1, orca2, orca3 ...

Si j'essaye quelque chose comme

paste("orca",i,sep="")=list_name[[i]]

Je reçois cette erreur

target of assignment expands to non-language object

Y a-t-il une autre solution?

83
Maiasaura

Utilisez assign:

assign(paste("orca", i, sep = ""), list_name[[i]])
104
Shane

Il me semble que vous auriez peut-être intérêt à utiliser une liste plutôt que d'utiliser orca1, orca2, etc., alors ce serait orca[1], orca[2], ...

Habituellement, vous faites une liste de variables différenciées par rien d’autre qu'un nombre, car ce nombre serait un moyen pratique d’y accéder ultérieurement.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

Sinon, assign est exactement ce que vous voulez.

32
John

Ne créez pas de cadres de données. Conservez la liste, nommez ses éléments mais ne la joignez pas.

La principale raison à cela est que si vous créez des variables lors de vos déplacements, vous devrez presque toujours les parcourir plus tard pour effectuer quelque chose d’utile. Là, vous serez à nouveau forcé de parcourir chacun des noms que vous avez créés à la volée.

Il est beaucoup plus facile de nommer les éléments de la liste et de parcourir les noms. 

En ce qui concerne attach, sa très mauvaise pratique de programmation en R risque de causer beaucoup de problèmes si vous ne faites pas attention.

9
sidquanto

FAQ dit:

Si tu as

varname <- c("a", "b", "d")

tu peux faire

get(varname[1]) + 2

for

a + 2

ou

assign(varname[1], 2 + 2)

for

a <- 2 + 2

Il semble donc que vous utilisiez GET lorsque vous souhaitez évaluer une formule qui utilise une variable (telle qu'une concaténation) et ASSIGN lorsque vous souhaitez affecter une valeur à une variable déclarée. 

Syntaxe pour assigner: Assign (x, valeur)

x: un nom de variable, donné sous forme de chaîne de caractères. Aucune contrainte n'est exercée et le premier élément d'un vecteur de caractère de longueur supérieure à un sera utilisé, avec un avertissement.

valeur: valeur à affecter à x.

1
Mox

Une autre solution délicate consiste à nommer les éléments de liste et attach it:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa
0
Marek