Подтвердить что ты не робот

Как вызвать объект с символьной переменной с тем же именем

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

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"

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

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

4b9b3361

Ответ 1

Я думаю, вы хотите 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, которая извлекает сразу несколько переменных. Здесь он используется для извлечения всех вещей, которые были загружены вызовом для загрузки.

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