tags:

views:

44

answers:

2

Assume I have a function that reads data from a MySQL table, manipulates it and returns some data.frame. Note the function is just an example whose functionality does not matter itself..., E.g.:

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(...)

I end up with a data.frame called mydf. Now I´d like to do to this to a character vector of SQL table names AND name the returned dataframes correspondingly. If I just use

x=lapply(MySQLtablenames,addRowSd,con)

I´ll get some list called x. Of course I could unlist and rename everything the way I´d like to, but my question is:

How can I make lapply (or another comparable function) return multple single dataframes or at least a list that contains some names derived from my character vector "MySQLtablenames"?

+1  A: 

just found an answer on my own:

assign("somename",dframe,envir = .GlobalEnv)
ran2
You could run into scoping issues with this. E.g if you want to use function inside another function, then your data.frame is created in global environment. You could play with `parent.frame` to improve your method.
Marek
In both your examples, you are inserting a DF into a list (or `lapply` returns a list). In those cases, the name of the object that is the DF is irrelevant, is it not. What matter is the `names` for the list components. If I were doing this, I'd store the DFs in a list, set the names on the list after the table names, as per Marek's comment above, and then work with the list. If you want to refer to the individual DFs by name, use `with(x, DF.name)` where `x` is list returned by `lapply` and `DF.name` is the name of the DF you want to access or some function applied to it.
Gavin Simpson
@Marek, currently the only thing that runs into scoping issues is my brain. the parent.frame stuff is all new to me and I do not get it yet, but thx for pointing to it. What will cause the scoping issues? Loading to much data from the database to the same (global) environment?
ran2
+1  A: 

If you supply sapply a character vector, it will name the items in the returned list by the supplied character vector (USE.NAMES default to TRUE)... I would also use simplify=FALSE as depending on the data.frames returned you may get unpredictable results

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