Excel ファイル

R のリストオブジェクトに行列を保存して、そのリストを Excel ファイルに保存することができる。リストの名前が、Excel ファイルのシート名になる。パッケージは XLConnect を利用する。

リストオブジェクトを Excel シートに書き出す関数。

library(XLConnect)
SaveExcel <- function(data.list, file.name = NULL) {
    if (is.null(file.name)) stop("File name is invalid.")
    if (is.null(names(data.list))) stop("List name is invalid.")
    
    workbook <- loadWorkbook(file.name, create = TRUE)
    createSheet(workbook, names(data.list))
    writeWorksheet(workbook, data.list, names(data.list), header = TRUE)
    saveWorkbook(workbook)
}

データの書き出し。

mat1 <- matrix(rnorm(100), ncol = 4)
mat2 <- matrix(rnorm(100), ncol = 4)
mat3 <- matrix(rnorm(100), ncol = 4)

data.list <- list(Matrix_1 = mat1, Matrix_2 = mat2, Matrix_3 = mat3)
SaveExcel(data.list, "tmp.xlsx")

R で書き出した Excel ファイルは以下のようになる。

R で作成したエクセルファイル

for 文で SaveExcel を繰り返して利用すると、そのうち以下のようなエラーが発生する場合がる。

for (i in 1:1000000) {
    SaveExcel(table_data, 'tmp.xlsx')
}
## Error in .jcall("RJavaTools", "Z", "hasMethod", .jcast(x, "java/lang/Object"),  :
##   java.lang.OutOfMemoryError: Java heap space

この際に gc 関数を for 文のブロックに追加すればエラーがでなくなる。

for (i in 1:1000000) {
    gc()
    SaveExcel(table_data, 'tmp.xlsx')
}

References

  1. Function to save R list into separate Excel worksheets. stackoverflow