Как использовать значение, указанное в вызове функции в качестве «переменной» - PullRequest
0 голосов
/ 22 марта 2012

Мне интересно, возможно ли в R использовать значение, объявленное в вызове функции как «переменную» часть самой функции, аналогично функциональности, доступной в SAS IML.

Учитывая что-то вроде этого:

put.together <- function(suffix, numbers) {
new.suffix <<- as.data.frame(numbers)
return(new.suffix)
}

x <- c(seq(1000,1012, 1))
put.together(part.a, x)

new.part.a   ##### does not exist!!

new.suffix   ##### does exist

Как написано, функция возвращает фрейм данных с именем new.suffix, как и должно быть, потому что это то, что я прошу это сделать.

Я хотел бы получить возвращенный фрейм данных, который называется new.part.a.


РЕДАКТИРОВАТЬ: была запрошена дополнительная информация о целях анализа

Цель вопроса - создать кадры данных, которые будут отправлены в другую функцию для анализа.

Существует банк данных, в котором элементы организованы в группы по номеру, а другие люди организовывают группы в значимом наборе.

Каждая группа имеет идентификационный номер. Я использую информацию, предоставленную другими, чтобы собрать группы, как они указаны.

Например, мне бы дали набор идентификационных номеров, таких как: part-1 = 102263, 102338, 202236, 302342, 902273, 102337, 402233.

Итак, часть-1 состоит из семи групп, каждая из которых имеет несколько элементов.

Я использую идентификаторы в слиянии, чтобы из большого банка данных извлекались только группы интересов.

Вот что у меня есть для одного комплекта:

### all.possible.elements.bank <- .csv file from large database ###

id.part.1 <- as.data.frame(c(102263, 102338, 202236, 302342, 902273, 102337, 402233))
bank.names <- c("bank.id")
colnames(id.part.1) <- bank.names
part.sort <- matrix(seq(1,nrow(id.part.1),1)) 
sort.part.1 <- cbind(id.part.1, part.sort)

final.part.1 <- as.data.frame(merge(sort.part.1, all.possible.elements.bank, 
by="bank.id", all.x=TRUE))

Процесс выше повторяется много, много раз.

Я знаю, что я мог бы сделать это для всех коллекций, которые я собрал бы, но я думал, что смогу обернуть процесс выбора в функцию. Единственными вещами, которые могли бы измениться, были бы номера деталей (часть-1, часть-2 и т. Д.) И выбранные группы.

Ответы [ 2 ]

4 голосов
/ 23 марта 2012

Можно использовать функцию assign (и, возможно, deparse и substitute), но настоятельно не рекомендуется делать такие вещи.Почему вы не можете просто вернуть фрейм данных и вызвать такую ​​функцию, как:

new.part.a <- put.together(x)

Как правило, это лучший подход.

Если вы действительно хотите что-то изменить в глобальной среде, вам может потребоваться макрос, посмотрите функцию defmacro в пакете gtools и, что важнее всего, прочитайте документ в разделе ссылок на странице справки..

1 голос
/ 23 марта 2012

Это редко то, что вам следует делать ... назначение вещей из функциональной среды может привести к всевозможным неприятностям.

Однако вы можете сделать это, используя assign:

put.together <- function(suffix, numbers) {
   assign(paste('new',
                deparse(substitute(suffix)),
                sep='.'),
          as.data.frame(numbers),
          envir=parent.env(environment()))
}

put.together(part.a, 1:20)

Но, как сказал Грег, это обычно не нужно и всегда опасно при неправильном использовании.

...