2014-11-24 2 views
0

У меня есть функция в R, которая структурирует мои исходные данные. Я создаю dataframe под названием output, а затем хочу сделать имя динамической переменной в зависимости от значения функции block.Восстановить/получить динамическую переменную из функции R

Выходной объект действительно содержит dataframe, как я хочу, и переименовать его динамически, в конце функции я делаю это (в пределах функции):

a = assign(paste("output", block, sep=""), output) 

... но после запуска функции нет объекта output1 (если block = 1). Я просто не могу получить выходной объект, не просто output, либо динамическую версию output1.

Я попытался это тогда:

а = Присвоить (паста ("выход", блок, Сентябрь = ""), выход) возврата (а)

... но до сих пор - никакого успеха , Как получить динамическую выходную переменную? Где моя ошибка?

+3

Почти невозможно сказать где ошибка не имеет воспроизводимого примера, включая функцию –

ответ

4

Среды.

assign будет по умолчанию создавать переменную в среде, в которой он вызван. Читайте об окружающей среде здесь: http://adv-r.had.co.nz/Environments.html

Я предполагаю, что вы делаете что-то вроде:

foo <- function(x){ assign("b", x); b} 

Если вы запустите foo(5), вы увидите, что она возвращает 5, как и ожидалось (подразумевая, что b была успешно создана где-то), но b не будет существовать в вашей текущей среде.

Если, однако, вы делаете что-то вроде этого

foo <- function(x){ assign("b", x, envir=parent.frame()); b} 

Здесь вы присваиваете не в текущей среде в то время assign называется (что случается foo «s окружающая среда). Вместо этого вы назначаете родительскую среду (которая, поскольку вы вызываете эту функцию напрямую, будет вашей средой).

Вся эта сложность должна показать вам, что это будет довольно сложно, кошмар для поддержания и действительно плохая идея с точки зрения обслуживания. Вы бы, конечно, лучше с чем-то вроде:

foo <- function(x) { return(x) }; 
b <- foo(5) 

Или, если вам нужно несколько деталей возвращенных:

foo <- function(x) { return(list(df=data.frame(col1=x), b=x)) } 
results <- foo(5) 
df <- results$df 
b <- results$b 

Но наша не причина, почему ...

+1

Вы можете заменить 'parent.env (environment())' на 'parent.frame()' для семантики более чистого кода :) –

Смежные вопросы