web-dev-qa-db-fra.com

Comment appeler un objet avec la variable de caractère du même nom

J'essaie d'écrire une fonction dans R pour analyser par lots un certain nombre de fichiers de manière similaire. Les fichiers sont de classe ExpressionSetIllumina. Je peux créer un vecteur de caractères (chaîne) avec les noms de tous les fichiers du répertoire et charger chacun d'eux:

list = list.files()
for (i in list[1]) {    
  load(i)
}

Cela charge les fichiers correctement

> ls()
[1] "i"                    "list"                 "SSD.BA.vsn"
> class(SSD.BA.vsn)
[1] "ExpressionSetIllumina"
attr(,"package")
[1] "beadarray"

Ce que je veux faire maintenant, c'est utiliser i (chaîne de caractères "SSD.BA.vsn") pour affecter l'objet SSD.BA.vsn à une nouvelle donnée objet afin que:

>data = SomeFunction(i)
>class(data)
[1] "ExpressionSetIllumina"
attr(,"package")
[1] "beadarray"

Mais tout ce que j'ai essayé jusqu'à présent ne renvoie que des données en tant que vecteur de caractères de la même valeur que i ou ne fonctionne pas du tout. Je me demande donc s'il y a une fonction qui le ferait pour moi ou si je dois m'y prendre autrement.

J'ai le nom d'un objet ou d'une variable stocké sous forme de chaîne dans un vecteur de caractères. Comment puis-je utiliser le nom d'objet chaîne pour faire quelque chose à l'objet?

34
Ophiothrix

Je pense que vous voulez get .

data <- get(i)

Cela dit, une fois que vous commencez à utiliser get (et son équivalent, assign ), vous vous retrouvez généralement avec un code horrible illisible.

Pour des analyses par lots comme la vôtre, il est souvent préférable de lire toutes vos données dans une liste de trames de données, puis utilisez généreusement lapply . Quelque chose comme:

data_files <- list.files()
all_vars <- lapply(data_files, function(file)
{
  vars_loaded <- load(file)
  mget(vars_loaded, parent.frame())
})

mget est la version de get qui récupère plusieurs variables à la fois. Ici, il est utilisé pour récupérer toutes les choses qui ont été chargées par l'appel à charger.

Vous avez maintenant une liste de listes: la liste de niveau supérieur est liée au fichier, les listes de niveau inférieur contiennent les variables chargées à partir de ce fichier.

50
Richie Cotton