メモ:rmarkdown
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン | 次のリビジョン両方とも次のリビジョン | ||
メモ:rmarkdown [2021/11/10 09:52] – [丸囲み文字] Wiki Editor | メモ:rmarkdown [2021/11/10 10:27] – [kableから出力されるLatexコードを加工する] Wiki Editor | ||
---|---|---|---|
行 462: | 行 462: | ||
このように、\multirowのコマンドの部分の< | このように、\multirowのコマンドの部分の< | ||
+ | |||
+ | ===== kableで出力するテーブル内の文字の回転 ===== | ||
+ | ラベルに長い文字列を使うようなとき、表頭の文字列を90度回転して縦方向にしたい時がある。その場合は、kableExtraのrow_specを使えばよい。 | ||
+ | |||
+ | kable() %> | ||
+ | .... %>% | ||
+ | .... %>% | ||
+ | row_spec(0, angle = -90) | ||
+ | |||
+ | これで0行目=ヘッダの文字列を90度回転できる。この他にも、セルごとに個別に設定するには、cell_specも使える。 | ||
+ | |||
+ | DATA[1, 5] <- cell_spec(DATA[1, | ||
+ | |||
+ | cell_specはセル内にLatexなりHTMLのコードを直接埋め込む。したがって、個々のセルに対して処理を行っておく必要がある。テーブルのヘッダの場合は、cell_specを利用して必要なコードを埋め込んだヘッダのベクトルを生成し、kableのcol.namesに渡すという手間がかかる。なおcell_specはLatexのコードをデータに直接埋め込むので、kabelのオプションで「escape=FALSE」を指定しておかないと、コードがそのまま文字として出力されてしまう。 | ||
+ | |||
+ | 上記は両方指定しても効果を発揮する。そのため、行全体を90度回転させ、特定のセルだけ-90度回転するように指定すれば、そのセルだけ回転させないということができる。 | ||
+ | |||
+ | 文字列を回転する際に、回転の中心点を決めることができる。angleを指定すると、Latex側では\rotateboxで文字列が回転される。この時、標準では文字列の左端を中心に回転が行われる。「angle=90」ならば、文字列の先頭を中心に反時計回りに回転するので、行内の全てのセルにangle=90が設定されている場合、文字列の先頭が下にきて先頭がセルの下で揃うことになる。逆に「angle=-90」とすると、文字列の先頭を中心に時計回りに回転するため、文字列の先頭が上にきてセルの上で先頭が揃う。 | ||
+ | |||
+ | この時、angle=-90で時計回りに回転しつつ、文字列をセルの下で揃えたい場合には、回転の中心を文字列の末尾=右端にする必要がある。右端を中心に時計回りすると、行頭が持ち上がる形で回転し、文字列はセルの下側で揃うことになる。しかしkableExtra側ではオプションがないので、Latexのコマンドで調整する。angleを設定した際に利用される\rotateboxのオプションは以下の通り。 | ||
+ | |||
+ | \rotatebox[回転の中心など]{角度}{対象の文字列} | ||
+ | |||
+ | kableExtraでは\rotateboxの回転の中心は指定されずデフォルトでハードコーディングされているため、このページに記載したようにLatexのコードを文字列として変数に入れ無理やり正規表現で書き換えるか、一時的に\rotateboxコマンドの定義を書き換える。後者の場合は、以下のようにする。 | ||
+ | |||
+ | \let\orgrotatebox\rotatebox% | ||
+ | \renewcommand{\rotatebox}[2]{\orgrotatebox[origin=r]{# | ||
+ | |||
+ | 基本的には、renewcommandで\rotateboxの定義をオプションを指定した状態に書き換えることで、kableから呼ばれたときに、改変された\rotateboxが用いられるため、文字列の右端を中心に回転され目的の挙動となる。ここで注意が必要なのは、\rotateboxの再定義に\rotateboxコマンドを直接使うと、再帰的に展開されてリソースを食い尽くしてエラーとなる(ハマった)。そこで、いったん\letコマンドを使って一旦「\rotatebox」を「\orgrotatebox」にコピーしておき、コピーしたコマンドを使って\rotateboxの定義を再定義する。コピーしておいたコマンドは、ここでの変更を元に戻す際にも使う。なお、行末の「%」はコマンドは、Latexで単一改行が空白として扱われてコマンドが連続したように解釈され、不用意なエラーを生じることを回避するもので、ここでは必要ないかもしれない。 | ||
+ | |||
+ | \renewcommandの使い方は | ||
+ | |||
+ | \renewcommand{対象のコマンド}[引数の数]{再定義したコマンドの内容} | ||
+ | |||
+ | なので、ここでは\orgrotateboxにコピーしたオリジナルの\rotateboxを使って、オプションの回転中心点を決める[origin=r]を指定した状態の\rotateboxコマンドを再定義している。origin=rで文字列の右端を回転軸にする。他にもx, | ||
メモ/rmarkdown.txt · 最終更新: 2023/06/22 11:00 by Wiki Editor