Как вызвать объект с символьной переменной с тем же именем - PullRequest
33 голосов
/ 31 января 2012

Я пытаюсь написать функцию в R для пакетного анализа ряда файлов аналогичным образом.Файлы имеют класс ExpressionSetIllumina.Я могу сделать символьный (строковый) вектор с именами всех файлов в каталоге и загрузить каждый из них:

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

Это загружает файлы правильно

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

Что я хочу сделатьтеперь нужно использовать i (строка символов "SSD.BA.vsn"), чтобы присвоить объекту SSD.BA.vsn данные нового объекта, так что:

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

Но все, что я до сих пор пробовал, просто возвращает данные каксимвольный вектор того же значения, что и я или не работает вообще.Поэтому мне интересно, есть ли функция, которая сделала бы это для меня, или мне нужно пойти по-другому.

У меня есть имя объекта или переменной, хранящейся в виде строки в символьном векторе.Как я могу использовать строковое имя объекта, чтобы что-то сделать с объектом?

1 Ответ

47 голосов
/ 31 января 2012

Я думаю, что вы хотите get.

data <- get(i)

Тем не менее, как только вы начинаете использовать get (и его аналог, assign), вы обычно получаете ужасный нечитаемый код.

Для группового анализа, подобного вашему, часто лучше прочитать все ваши данные в список фреймов данных, а затем свободно использовать lapply. Что-то вроде:

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

mget - это версия get, которая извлекает несколько переменных одновременно. Здесь он используется для извлечения всех вещей, которые были загружены вызовом для загрузки.

Теперь у вас есть список списков: список верхнего уровня связан с файлом, списки нижнего уровня содержат переменные, загруженные из этого файла.

...