Javaに依存せずにxlsxを読む
R Advent Calendar2014@Qiitaの2日目です。
Javaに依存したくない方、いると思います。
こちらにあるようにこれまでxlsxファイルを扱おうと思うと、多くのパッケージではJavaを必要としていました。
そんな事態を解決すべく開発されたのがopenxlsxパッケージです。
コード例
以下は入出力の例です。
# ブックから直接データフレームとして読み込みたい場合 read.xlsx("iris.xlsx", sheet=1) readWorkbook("iris.xlsx",sheet=1) # 仮想ブックとして読み込みたい場合 loadWorkbook("iris.xlsx") # 出力 # 作成した仮想ブックを出力したい場合 saveWorkbook(wb, file = "iris.xlsx", overwrite = TRUE) # 仮想ブックを作成せずデータ(data.frame)を直接出力したい場合 write.xlsx(iris, "iris.xlsx")
以下は条件付き書式などを使った例です。
# 仮想ブックの作成 wb <- createWorkbook() addWorksheet(wb, "sample") # スタイルを作成(文字色とセルの色を指定) negStyle <- createStyle(fontColour = "white", bgFill = "red") posStyle <- createStyle(fontColour = "black", bgFill = "grey") # データの書き込み writeData(wb, sheet=1, x=-5:5) writeData(wb, sheet=1, x=LETTERS[1:11], startCol=2) # 条件付き書式の設定 conditionalFormat(wb, 1, cols=1, rows=1:11, rule="!=0", style = negStyle) conditionalFormat(wb, 1, cols=1, rows=1:11, rule="==0", style = posStyle) # 出力 saveWorkbook(wb, "sample.xlsx",overwrite = TRUE) # 出力をExcelを開いて確認 openXL("sample.xlsx")
なにが嬉しいのか
Javaに依存しないのでOutOfMemoryErrorを気にしなくて良いという利点があります。
例えばJavaに依存するXLConnectパッケージの場合、以下のコードはエラーになります。
library(XLConnect) iris1000 <- do.call("rbind", rep(list(iris), 1000)) wb <- loadWorkbook("smp.xlsx", create=TRUE) wb["hoge"] <- iris1000 以下にエラー .jcall("RJavaTools", "Ljava/lang/Object;", "newInstance", .jfindClass(class), : java.lang.OutOfMemoryError: Java heap space
まあ出力でそんなでかいデータxlsxに吐き出すなよって話かもしれませんが、そういうこともあるんだ。
ただしxlsファイルは読めないから、負の遺産に悩まされてる方はおとなしくJava入れてください。
enjoy!