2016-11-02 3 views
0

Я ищу короткое решение для создания и использования разных таблиц для циклов, где переменная цикла является частью имени.Создайте и используйте разные таблицы для for-loops в R короче.

Я нашел следующие решения:

Если я хочу создать таблицы в цикле я могу использовать назначить вместе с пастой. Например:

for (f in files){ 
assign(paste0("A_",f), readWorksheetFromFile(paste0(f,".xlsx")))} 

И если я хочу использовать эти таблицы, я могу использовать Eval, разобрать и paste0 следующим образом:

for(f in files){ 
    x <- eval(parse(text=paste0("A_",f)))} 

Проблема заключается в том, что я должен использовать эти конструкции очень часто и код становится очень длинным. У кого-нибудь есть более короткое решение, чтобы сделать это в R?

E.g. в SAS я мог бы использовать что-то вроде (как я помню)

x = A_&f; 

вместо того

x <- eval(parse(text=paste0("A_",f))) 

Edit

На основе следующих ответов я нашел это решение:

В процесс создания объектов в цикле Я могу использовать функцию

`%c%` = function(a, b) paste0(a, b) 

следующим образом для двух или более строк:

"A_" %c% f 
"A_" %c% f %c% r 

В случае, если я хочу использовать этот объект в цикле можно использовать функцию:

`%u%` = function(a, b) eval(parse(text=paste0(a,b))) 

следующим образом для двух или более строк:

"A_" %u% f 
"A_" %c% f %u% r 

Обратите внимание, что я использовал% u% только на последнем шаге.

ответ

0

Вы можете попробовать использовать список:

l = vector("list", length(files)) 
names(l) = paste0("A_", files) 
for(i in seq_along(files)) 
    l[[i]] = readWorksheetFromFile(paste0(files[i],".xlsx"))) 

Если вам нужно, чтобы они были отдельные переменные, вы можете создать свою собственную среду и хранить их там:

myenv = new.env() 
lapply(seq_along(l), function(i) assign(names(l)[i], l[[i]], pos = myenv)) 

и получить переменные с помощью get:

vars = ls(pos = myenv) 
get(vars[1], pos = myenv) 

EDIT

Так на самом деле вы просто ищете оператора, как _&:

`%&%` = function(a, b) get(paste0(a, "_", b)) 

"A" %&% f 

A = "A" 
A %&% f 
+0

Спасибо. Это может помочь в особых ситуациях. Но это не намного короче, чем мое другое решение. –

+0

@ThomasR, см. Править. – mikeck

+0

Это решение не сработало в моем случае, но, по крайней мере, это был отличный пример. Основываясь на вашей идее, я создал свое окончательное решение. См. Редактирование моего оригинального сообщения. Спасибо, что помогли мне не только с этой проблемой, но и понять, как создавать функции в целом. –

0

Это то, что я обычно делаю, когда я должен читать много файлов в пакете:

l <- lapply(paste0(files,".xlsx"), readWorksheetFromFile) 
names(l) <- paste0("A_", files) 

Нет for требуется петля.

l - это список, содержащий наименование data.frame s. Используйте str(l), чтобы просмотреть структуру.

Один data.frame или таблицы могут быть доступны в 3 различными способами:

l[[1]] 
l$A_File1 
l[["A_File1"]] 

фиктивные данные

Чтобы сделать это воспроизводимый пример я создал фиктивные данные следующим образом:

set.seed(1234) 
readWorksheetFromFile <- function(f) { 
    n <- sample.int(5, 1) 
    data.frame(a = sample.int(9, n), b = sample(LETTERS, n), 
      stringsAsFactors = FALSE) 
} 
files <- paste0("File", 1:5) 
Смежные вопросы