前回の記事でテーブルをRTFファイルとして出力することを検討していたのですが、pharmaRTFパッケージは検討していなかったで追加で確認しました。
このパッケージ4年前からアップデートが止まっており、おそらくバグが放置されていると思ってたので前回は見ていなかったのですが、臨床試験の帳票出力を想定して開発されているパッケージは貴重なので念のため確認しました。
pharmaRTFパッケージとは
製薬業界での利用を想定したRTFファイル出力支援パッケージです。ただしテーブルそのものはhuxtableで作成し、ページサイズやヘッダフッタの設定をこのパッケージで実施する形になっています。huxtableはRTFファイルを出力する関数はありますが、ヘッダフッタは設定できなかったのでこのパッケージで機能を補完している感じのようです。
pharmaverseのパッケージに含まれています。
出力例
公式ページに出力例が載っていますので、まずはそれを試してみます。
前述の通りテーブルはhuxtableを使って定義しますので表にしたいデータをhuxtableオブジェクトに変換します。
dat <- iris %>%
select(Species, everything())
ht <- huxtable::as_hux(dat, add_colnames=TRUE) %>%
huxtable::set_bold(1, 1:ncol(dat), TRUE) %>%
huxtable::set_bottom_border(1, 1:ncol(dat), 1) %>%
huxtable::set_width(1.5)
ht[1:10,]
rtf_doc関数でRTFの属性を定義します。rtf_doc関数で定義できるのは以下の要素らしいです。rtf_docで作成したオブジェクトをwrite_rtf関数で処理すれば指定のパスにRTFが出力されるようです。
- デフォルトのフォントとフォントサイズ
- 余白
- ページの向き
- ヘッダーフッターの高さ
- ページの大きさ
- ヘッダーの行
- その他の設定
doc <- rtf_doc(ht, titles=list(hf_line("The Iris Dataset", bold=TRUE)))
write_rtf(doc, file="table1.rtf")
wordで開いた結果は以下の通りです。

デフォルトだとテーブルの最初の行はヘッダーに表示されるようです。
カスタマイズ
このままではページサイズやフォントがよろしくないので、カスタマイズします。
前回と同様に以下のコードで日本語のカラム名が付与されたデータを出力します。ただし複数ページを出力した結果を見るため、irisデータをすべで出力します。
header <- tribble(
~"out1",~"out2",~"out3",~"out4",~"out5",
"がく片の長さ", "がく片の幅", "花弁の長さ","花弁の幅", "種類"
)
dat <- iris %>%
dplyr::mutate(
out1=as.character(Sepal.Length),
out2=as.character(Sepal.Width),
out3=as.character(Petal.Length),
out4=as.character(Petal.Width),
out5=as.character(Species)
) %>%
dplyr::select(starts_with("out"))
res <- bind_rows(header, dat)
ht <- res %>%
huxtable::hux(add_colnames = FALSE) %>%
huxtable::set_font(row=1:length(res$out1), value="MS Mincho") %>%
huxtable::set_width(1) %>%
huxtable::set_align(col=everywhere, value="center") %>%
huxtable::set_top_border(row=1, col=everywhere) %>%
huxtable::set_bold(row=1, value=TRUE) %>%
huxtable::set_bottom_border(row=1, col=everywhere) %>%
huxtable::set_bottom_border(row=length(res$out1), col=everywhere)
設定は以下の通りです。
- フォントをMS明朝に設定
set_font(value=”MS Mincho”)) - ヘッダーにはテーブルの最初の行を表示しない
(set_header_row(value=0)) - ヘッダーに試験番号を表示
(add_titles(hf_line(“Study No. XXXXX”, italic=FALSE, align=’right’)) - フッターに現在のページおよびページ数を表示
(add_footnotes(hf_line(“\\chpgn of {\\field{\\*\\fldinst NUMPAGES }}”, italic=FALSE, align=’center’)) - ページサイズ(A4)と余白(上35mm, それ以外は30mm)を設定
(set_orientation(value=”landscape”))
(set_pagesize(value=pgsz))
(set_margins(value=mrgn))
ページサイズと余白は名前付き数値リストとして設定します。フィールドコードも埋め込めるのでページ数も表示できるみたいです。これはいいね。
ただしフィールドコードの「\」は「\\」に置き換える必要があります。これはバックスラッシュはRの予約文字であるため、バックスラッシュを重ねてエスケープする必要があるからです。
以下のコードでRTFファイルを出力しました。
#page size(inch)
pgsz <-c(width=8.3, height=11.7)
#margins (inch)
mgn <-c(top = 1.4, bottom = 1.2, left = 1.2, right = 1.2)
doc <- rtf_doc(ht) %>%
set_font(value="MS Mincho") %>%
set_orientation(value="landscape") %>%
set_header_rows(value=0) %>%
set_pagesize(value=pgsz) %>%
set_margins(value=mgn) %>%
add_titles(hf_line("Study No. XXXXX", italic=FALSE, align='right')) %>%
add_footnotes(hf_line("\\chpgn of {\\field{\\*\\fldinst NUMPAGES }}", italic=FALSE, align='center'))
write_rtf(doc, file="pharmaRTF_JPfont.rtf")

ぱっと見問題なく出力できましたが、マージンとページサイズを設定するときに問題が発生しました。マージンとページサイズはinchで指定しないといけません。日本のwordはmm指定なので、inchに変換して指定するのですが小数第二位以降を指定するとテーブルの左上に謎の数値が出力されます。
例えばページサイズを以下のように設定すると元データにはない数値が表示されてしまいます。A4サイズをinchに直すと以下の設定が正確なはずなのですが
pgsz <-c(width=8.268, height=11.693)

「.92.92」という謎の文字列が表示されています。もちろん元のデータにはありません。
なので若干不正確ですが、ページサイズと余白は小数第1位まで指定するしかなさそうです。やはりといいますか、海外の方が開発されているので日本語環境でのバグが他にもあるかもしれませんね。
まとめ
ページサイズと余白の指定は注意点がありますが、日本語でも問題なく出力できました。フィールドコードをヘッダーとフッターに挿入可能であるため、ページ番号の表示も可能でした。
PharmaRTFはRTFファイルのページ設定を定義するだけなので、ヘッダーフッターなどが不要であればhuxtableのみで十分だと思います。段落が出力できるのであればもっと便利なんだけどな。