2010-10-28 3 views
5

Предположим, у меня есть функция, которая считывает данные из таблицы MySQL, обрабатывает ее и возвращает некоторый data.frame. Обратите внимание, что функция является лишь примером которого функциональность не сама материя ... и т.д .:Как вернуть data.frame с заданным именем из функции?

addRowSd <- function(table,con,pattern="^Variable") { 

dframe <- dbReadTable(con,table) 
cn <- colnames(dframe) 
qs <- subset(x, x %in% grep(pattern, x, value=TRUE)) 
dframe$qsd <- sd(t(dframe[,c(qs)])) 

return(dframe) 
} 

mydf$sd <- addRowSd(...) 

Я в конечном итоге с data.frame называется mydf. Теперь я хотел бы сделать это с символьным вектором имен таблиц SQL и соответствующим образом назвать возвращаемые данные. Если я просто использую

x=lapply(MySQLtablenames,addRowSd,con) 

Я получу список, названный x. Конечно, я мог бы перечислить и переименовать все так, как мне хотелось бы, но мой вопрос:

Как я могу сделать lapply (или другую сопоставимую функцию) возвращать многомерные одиночные кадры или, по крайней мере, список, содержащий некоторые имена, полученные из моего символьного вектора «MySQLtablenames»?

+0

возможно это может помочь сделать функцию addRowSd присвоить некоторое имя возвращенного data.frame ... –

+1

Как о 'names (x) <- MySQLtablenames' или в одной строке' x <-setNames (lapply (MySQ Ltablenames, addRowSd, con), MySQLtablenames) 'или' x <-lapply (setNames (MySQLtablenames, MySQLtablenames), addRowSd, con) ' – Marek

ответ

9

только что нашел ответ на мой собственный:

assign("somename",dframe,envir = .GlobalEnv) 
+0

Вы можете столкнуться с проблемами с этим вопросом. Например, если вы хотите использовать функцию внутри другой функции, то ваш data.frame создается в глобальной среде. Вы можете играть с 'parent.frame', чтобы улучшить свой метод. – Marek

+2

В обоих примерах вы вставляете DF в список (или 'lapply' возвращает список). В этих случаях имя объекта, являющегося DF, не имеет значения, не так ли. Какое значение имеет «имена» для компонентов списка. Если бы я делал это, я бы сохранил DF в списке, задал имена в списке после имен таблиц в соответствии с комментарием Marek выше, а затем работал со списком. Если вы хотите ссылаться на отдельные DF по имени, используйте 'with (x, DF.name)' где 'x' - это список, возвращаемый' lapply', а 'DF.name' - это имя DF, к которому вы хотите получить доступ или некоторая функция, применяемая к нему. –

+0

@Marek, в настоящее время единственное, что сталкивается с проблемами охвата, - это мой мозг. материал parent.frame для меня все новый, и я еще не понял его, но THX указал на него. Что вызовет проблемы? Загрузка большого количества данных из базы данных в одну и ту же (глобальную) среду? –

1

Если вы поставляете sapply вектор символов, он будет называть элементы в возвращаемом списке от прилагаемого вектора символов (USE.NAMES по умолчанию в TRUE). .. Я хотел бы также использовать упрощать = FALSE в зависимости от data.frames возвращается вы можете получить непредсказуемые результаты

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