目的 R のデータフレームまたは行列を,LaTeX ソースに変換する関数。 (R の MISC には,latex 関数があるが,Macintosh 用には用意されていないようなので) 使用法 print.latex(x, format="書式", ...) print(x, format="書式", ...) # x のクラスが "latex" のときにはこのように省略することも可 引数 x, # データフレームまたは行列。クラスとして "latex" を与えるとよいこともある file="" # LaTeX ソースの出力ファイル。デフォルトは画面へ出力。 append=FALSE # ファイルが存在するときは上書きする。追加するなら append=TRUE ctable=TRUE # ctable.sty を使う。通常の表を作るときには ctable=FALSE caption="" # 表のタイトル \caption{} cap="" # 表のタイトル(短縮版 ctable のときのみ有効) label="" # \label{} htbp="htbp" # ページ内の配置指示 [htbp] align=NULL # カラム内の配置指示 "rlcrlcrlc" など format=NULL # 表示書式。format="f5 i s" など tnote=NULL # tnote (ctable のみ) line.feed=NULL # \\[nn] (ctable でないとき) "-1.5mm" など na2blank=TRUE # NA を空白に置き換える。NA のままのときには FALSE ソース インストールは,以下の 1 行をコピーし,R コンソールにペーストする source("http://aoki2.si.gunma-u.ac.jp/R/src/print.latex.R", encoding="euc-jp") # データフレーム・行列を LaTeX の表にする print.latex <- function( x, # matrix or data frame; "latex" class file="", # output file (default to screen) append=FALSE, # rewrite or append output file ctable=TRUE, # use ctable.sty or not caption="", # caption cap="", # short caption (ctable only) label="", # label htbp="htbp", # layout ex. htpb="ht" or "p" etc. align=NULL, # algnment of column ex. align="rlcrlcrlc" format=NULL, # format of column ex. format="f5 2i s" == "%.5f %i %i %s" tnote=NULL, # tnote (ctable only) ex. tnote=c("xxx...", "yyy...",...) line.feed=NULL, # \\[nn] (not for ctable) ex. line.feed="-1.5mm" etc. na2blank=TRUE # display blank for NA values ) { nc <- ncol(x) # オブジェクトの列数 nr <- nrow(x) # オブジェクトの行数 has.rowname <- !is.null(rownames(x)) # 行名がある if (is.null(colnames(x))) { # 列名がないときは, colnames(x) <- paste("Col", 1:nc, sep="-") # "Col-##" の形式で名前を付ける } if (is.null(align)) { # align の指定がないときは, align <- paste(rep("c", nc+has.rowname), collapse="") # センター揃え "c…" にする } if (is.null(format)) { # format の指定がないときは, format <- rep("%s", nc) # "%s" で書く } else { # format の指定があるときは, format <- unlist(strsplit(format, "[ ,]")) # 文字ベクトルに分解 format <- unlist(sapply(format, function(str) { # Rf3 のような形式(R 繰り返し)に対応 rep <- sub("[a-z]+[0-9]*", "", str) if (rep == "") { rep <- "1" } rep <- as.integer(rep) fmt <- sub("^[0-9]*", "", str) return(rep(fmt, rep)) })) if (nc+has.rowname > length(format)) stop("too few formats") # 行名がないときは列数に等しいこと,行名があれば列数プラス1 else if (nc+has.rowname < length(format)) stop("too many formats") format <- sapply(1:(nc+has.rowname), function(i) { # 正式な format に変換する fmt <- format[i] ch <- substring(fmt, 1, 1) if (ch == "f") { format[i] <- paste("%.", substring(fmt, 2), "f", sep="") } else { format[i] <- paste("%", ch, sep="") } }) } cat("%\n", file=file, append=append, sep="") # ヘッダー if (ctable) { # ctable 形式で出力する場合 cat( "\\ctable[\n", "\tcap = {", cap, "},\n", "\tcaption = {", caption, "},\n", "\tlabel = ", label, ",\n", "\tpos = htbp\n", "]\n", "{", align, "}\n", file=file, append=append, sep="") if (is.null(tnote)) { cat("{}\n", file=file, append=append, sep="") } else { cat("{\n", file=file, append=append, sep="") sapply(1:length(tnote), function(i) cat("\\tnote[", letters[i], "]{", tnote[i], "}\n", file=file, append=append, sep="")) cat("}\n", file=file, append=append, sep="") } cat("{ \\FL\n", file=file, append=append, sep="") head <- sprintf("\t %s %s \\ML\n", if (has.rowname) "&" else "", paste(colnames(x), collapse=" & ")) cat(head, file=file, append=TRUE) for (i in 1:nr) { temp <- sapply(1:nc, function(j) sprintf(format[j+has.rowname], x[i, j])) if (has.rowname) { body <- sprintf("\t %s & %s", sprintf(format[1], rownames(x)[i]), paste(temp, collapse=" & ")) } else { body <- sprintf("\t %s", paste(temp, collapse=" & ")) } if (na2blank) { # na2blank == TRUE なら, body <- gsub("(^NA | NA | NA$)", " ", body) # NA を出力しない(空白を出力する) } if (i == nr) { body <- sprintf("%s \\LL\n", body) } else { body <- sprintf("%s \\NN\n", body) } cat(body, file=file, append=TRUE) } cat("}\n", file=file, append=TRUE, sep="") } else { # table 形式で出力する場合 cat( "\\begin{table}[", htbp, "]\n", "\t\\caption{", caption, "}\n", "\t\\label{", label, "}\n", "\t\\centering\n", "\t\t\\begin{tabular}{", align, "} \\hline\n", file=file, append=append, sep="") head <- sprintf("\t\t\t\t %s %s \\\\ \\hline\n", if (has.rowname) "&" else "", paste(colnames(x), collapse=" & ")) cat(head, file=file, append=TRUE) for (i in 1:nr) { temp <- sapply(1:nc, function(j) sprintf(format[j+has.rowname], x[i, j])) if (has.rowname) { body <- sprintf("\t\t\t %s & %s", sprintf(format[1], rownames(x)[i]), paste(temp, collapse=" & ")) } else { body <- sprintf("\t\t\t %s", paste(temp, collapse=" & ")) } if (na2blank) { # na2blank == TRUE なら, body <- gsub("(^NA | NA | NA$)", " ", body) # NA を出力しない(空白を出力する) } if (i == nr) { body <- sprintf("%s \\\\ \\hline\n", body) } else if (is.null(line.feed)) { body <- sprintf("%s \\\\\n", body) } else { body <- sprintf("%s \\\\[%s]\n", body, line.feed) } cat(body, file=file, append=TRUE) } cat("\t\t\\end{tabular}\n", "\\end{table}\n", file=file, append=TRUE, sep="") } cat("%\n", file=file, append=TRUE, sep="") # フッター } 使用例 > y <- matrix(rnorm(15),3) > print.latex(y,format="f1,f2,f3,f4,f5") > print(y,format="f1,f2,f3,f4,f5") % \ctable[ cap = {}, caption = {}, label = , pos = htbp ] {ccccc} {} { \FL Col-1 & Col-2 & Col-3 & Col-4 & Col-5 \ML 0.8 & 0.42 & -0.494 & -0.5716 & 0.06804 \NN -0.7 & 0.55 & -0.977 & -2.6457 & -0.49711 \NN 1.2 & -0.15 & -0.209 & -1.1252 & -0.26397 \LL } % > print.latex(y,format="f1,f2,f3,f4,f5",ctable=F) % \begin{table}[htbp] \caption{} \label{} \begin{center} \begin{tabular}{ccccc} \hline Col-1 & Col-2 & Col-3 & Col-4 & Col-5 \\ \hline 0.8 & 0.42 & -0.494 & -0.5716 & 0.06804 \\ -0.7 & 0.55 & -0.977 & -2.6457 & -0.49711 \\ 1.2 & -0.15 & -0.209 & -1.1252 & -0.26397 \\ \hline \end{tabular} \end{center} \end{table} % > class(y) <- "latex" # latex クラスにすると,print 関数は print.latex を呼ぶ。 > print(y,format="f1,f2,f3,f4,f5",ctable=F) % \begin{table}[htbp] \caption{} \label{} \begin{center} \begin{tabular}{ccccc} \hline Col-1 & Col-2 & Col-3 & Col-4 & Col-5 \\ \hline 0.8 & 0.42 & -0.494 & -0.5716 & 0.06804 \\ -0.7 & 0.55 & -0.977 & -2.6457 & -0.49711 \\ 1.2 & -0.15 & -0.209 & -1.1252 & -0.26397 \\ \hline \end{tabular} \end{center} \end{table} % > y # 単に latex クラスのオブジェクトを書くと,print.latex をデフォルトパラメータで呼び出すのと同じ % \ctable[ cap = {}, caption = {}, label = , pos = htbp ] {ccccc} {} { \FL Col-1 & Col-2 & Col-3 & Col-4 & Col-5 \ML 0.766844081830774 & 0.423531957258703 & -0.494376057746704 & -0.571619830805184 & 0.0680418734516652 \NN -0.657730380834299 & 0.54521802925664 & -0.976634479942584 & -2.64568788961159 & -0.497109023895327 \NN 1.17680670401891 & -0.153281338683701 & -0.209140384374655 & -1.12520371399254 & -0.263967400099695 \LL } %