Another solution to the R to Word table problem

[This article was first published on Realizations in Biostatistics, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Last time I used an HTML solution. This time, I create an RTF file:

# function: my.rtf.table # purpose: convert a matrix, data.frame, or array into a rtf table # output: text for RTF, possibly written to a file # inputs: # tab - a table, dataframe, or array (needs rownames and colnames) # outfile - name of file (or console if NULL, which is default) # rtffile - if T (default) then add {\rtf1 to beginning and } to end, making # a full RTF file, if F then leave these off # header - if T (default) then bold the table header # ... - passed to format for the table body only # tips: output to tempfile and use WordInsertFile(...) from the svViews # package to easily convert a table to Microsoft Word my.rtf.table <- function(tab,outfile=NULL,rtffile=T,header=T,...) { if (!is.null(outfile)) sink(outfile) tab.nrow<-nrow(tab) tab.ncol<-ncol(tab) if (rtffile) { #begin RTF document cat("{\\rtf1\n") } #populate header row cat("\\trowd\\trautofit1\\intbl\n") j <- 1 for (i in 1:(tab.ncol+1)) { cat("\\cellx",j,'\n',sep='') j<-j+1 } cat("{\n") # loop through and write column headers cat(" \\cell\n") for (i in 1:tab.ncol) { if (header) { cat('\\b ',colnames(tab)[i],"\\b0\\cell \n",sep='') } else { cat(colnames(tab)[i],"\\cell \n",sep='') } } cat("}\n") cat("{\n") cat("\\trowd\\trautofit1\\intbl\n") j<-1 for (i in 1:(tab.ncol+1)) { cat("\\cellx",j,'\n',sep='') j<-j+1 } cat("\\row }\n") #write table contents for (k in 1:tab.nrow) { cat("\\trowd\\trautofit1\\intbl\n") j<-1 for (i in 1:(tab.ncol+1)) { cat("\\cellx",j,'\n',sep='') j<-j+1 } cat("{\n") cat(rownames(tab)[k],'\\cell\n',sep='') for (i in 1:tab.ncol) { cat(format(tab[k,i],...),"\\cell \n",sep='') } cat("}\n") cat("{\n") cat("\\trowd\\trautofit1\\intbl\n") j<-1 for (i in 1:(tab.ncol+1)) { cat("\\cellx",j,'\n',sep='') j<-j+1 } cat("\\row }\n") } if (rtffile) { # end the rtffile cat("}\n") } if (!is.null(outfile)) sink() }

You'll need the package svViews (part of the SciViews series of packages) for this one.



library(svViews) myfile <- paste(tempfile(),".rtf") my.rtf.table(table,outfile=myfile) # use svViews commands to set up Word, if needed WordInsertFile(myfile) unlink(myfile)

Basically, what the above does is create a temporary file to hold the RTF document, then write the RTF code to recreate the table, then add the RTF file to Word. The table can then be manipulated as desired. Unfortunately, as the SciViews is Windows only, the automation part of this process is Windows only, but the file creation is not. Since myfile is a string variable, an R function can be written to execute a series of Applescript commands on the Macintosh.

To leave a comment for the author, please follow the link and comment on their blog: Realizations in Biostatistics.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)