Hi there,
As a result of my -omics analyses I have a series of data frames that I would like to output. Since they all belong to the same analysis I thought it was nice to save all these dataframes into a single .xls file, putting each dataframe into a separate sheet.
I found the function xlsx.writeMultipleData
from the r2excel
package that would do the job for me.
The code for this function is:
xlsx.writeMultipleData = function (file, ...)
{
require(xlsx, quietly = TRUE)
objects <- list(...)
fargs <- as.list(match.call(expand.dots = TRUE))
objnames <- as.character(fargs)[-c(1, 2)]
nobjects <- length(objects)
for (i in 1:nobjects) {
if (i == 1)
write.xlsx(objects[[i]], file, sheetName = objnames[i])
else write.xlsx(objects[[i]], file, sheetName = objnames[i],
append = TRUE)
}
}
If I assume to have two dataframe like this:
df1 <- data.frame(name = c("Jon", "Bill", "Maria"),
age = c(23, 41, 32))
df2 <- data.frame(name =c("Albert", "Mary","Joe"),
age = c(80,28,1))
I can save df1
and df2
in the same file by doing: xlsx.writeMultipleData(file="outputfile.xls",df1,df2)
.
My problem arise from the fact that the number of dataframes that I generate is not always constant (i.e. one time I can have df1 and df2
, one time I can have df1, df2 and df3
, one time I can have df1, df2, df3 and df4
).
So, I was wondering is there a general way to tell the function to save all the objects whose name matches df
into one file, without having to explicitly write all of them? I know it is not R, but what I am looking for is something like xlsx.writeMultipleData(file="outputfile.xls", df*)
.
Thanks a lot in advance for your help
Luca
Hi rplicastro! You keep saving my life with your adivice! :D Thanks a lot. you suggestion to use
writexl::write_xlsx
works like a charm. My dataframes are already attached to the R environment. I only have to attach them to the same list.Can I ask you why you do not recommend the solution you mentioned above?
Glad to hear my answers are helping!
The code itself is perfectly valid, but generally if you are using certain functions (e.g.
get
,<<-
,eval
, etc.) there is usually a better way to approach the problem. I don't know how the data.frames are being generated in your case, but ideally they would be generated in a list already so that you don't need to search for them in the environment, or manually specify the list later.I see, thanks for the explanation! 😊