2012-01-31 15 views
23

Estoy intentando escribir una función en R para analizar por lotes una cantidad de archivos de manera similar. Los archivos son de la clase ExpressionSetIllumina. Puedo hacer un vector de caracteres (string) con los nombres de todos los archivos en el directorio y cargar cada uno de ellos:Cómo llamar a un objeto con la variable de caracteres del mismo nombre

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

Esto carga los archivos correctamente

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

Lo que quiero hacer ahora es utilizar i (cadena de caracteres "SSD.BA.vsn") para asignar objeto SSD.BA.vsn a un nuevo dato de objeto de modo que:

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

Pero todo lo que he probado hasta ahora sólo devuelve datos como un vector de caracteres del mismo valor que yo o que no funciona en absoluto. Entonces me pregunto si hay una función que lo haría por mí o si tengo que hacerlo de otra manera.

Tengo el nombre de un objeto o variable almacenado como una cadena en un vector de caracteres. ¿Cómo puedo usar el nombre del objeto de cadena para hacer algo al objeto?

Respuesta

31

Creo que quieres get.

data <- get(i) 

Dicho esto, una vez que empiece a usar get (y su contraparte, assign), por lo general terminan con el código ilegible horrible.

Para análisis por lotes como el suyo, a menudo es mejor leer todos sus datos en una lista de marcos de datos, luego haga un uso liberal de lapply. Algo así como:

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

mget es la versión de get que recupera múltiples variables a la vez. Aquí se usa para recuperar todas las cosas cargadas por la llamada para cargar.

Ahora tiene una lista de listas: la lista de nivel superior está relacionada con el archivo, las listas de nivel inferior contienen las variables cargadas desde ese archivo.

+0

Justo lo que se necesitaba. ¡Gracias! Pero voy a tener en mente tu sugerencia sobre la legibilidad del código. – Ophiothrix

Cuestiones relacionadas