Как вернуть data.frame с заданным именем из функции?

Предположим, у меня есть функция, которая считывает данные из таблицы MySQL, манипулирует ими и возвращает некоторый 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"?


person Matt Bannert    schedule 28.10.2010    source источник
comment
возможно, это может помочь заставить функцию addRowSd присвоить какое-то имя возвращаемому data.frame ...   -  person Matt Bannert    schedule 28.10.2010
comment
Как насчет names(x) <- MySQLtablenames или в одну строку x<-setNames(lapply(MySQLtablenames,addRowSd,con),MySQLtablenames) или x<-lapply(setNames(MySQLtablenames,MySQLtablenames),addRowSd,con)   -  person Marek    schedule 28.10.2010


Ответы (2)


только что нашел ответ самостоятельно:

assign("somename",dframe,envir = .GlobalEnv)
person Matt Bannert    schedule 28.10.2010
comment
Из-за этого вы можете столкнуться с проблемами определения объема. Например, если вы хотите использовать функцию внутри другой функции, тогда ваш data.frame создается в глобальной среде. Вы можете поиграть с parent.frame, чтобы улучшить свой метод. - person Marek; 28.10.2010
comment
В обоих ваших примерах вы вставляете DF в список (или lapply возвращает список). В таких случаях имя объекта, являющегося DF, не имеет значения, не так ли. Какое значение имеет names для компонентов списка. Если бы я делал это, я бы сохранил DF в списке, установил имена в списке после имен таблиц, в соответствии с комментарием Марека выше, а затем работал бы со списком. Если вы хотите ссылаться на отдельные DF по имени, используйте with(x, DF.name), где x - это список, возвращаемый lapply, а DF.name - имя DF, к которому вы хотите получить доступ, или какой-либо функции, примененной к нему. - person Gavin Simpson; 28.10.2010
comment
@Marek, в настоящее время единственное, что сталкивается с проблемами при оценке, - это мой мозг. материал parent.frame для меня в новинку, и я его еще не понял, но спасибо за указание на него. Что вызовет проблемы с определением объема? Загрузка большого количества данных из базы данных в ту же (глобальную) среду? - person Matt Bannert; 28.10.2010
comment
Спустя 4+ года я просто добавляю ... НЕ делайте этого. Он также не будет проходить проверки CRAN. - person Matt Bannert; 19.03.2015

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

x=sapply(MySQLtablenames,addRowSd,con, simplify=FALSE)
person Aaron Statham    schedule 28.10.2010