ホームページ 勤務先↓
JavaScriptライブラリーを用いて作成.参考
このメモはRStudioのr-markdown(markdown+r)上でデータ解析を行うことを目的に作成
html_documentとして少し使ってみて感じたことは,
tex記法の数式が使えるメリットがあるが微調整が必要で,またtex並みの文章にするにはhtml記法も必要.それでも,簡単に文章が作れるメリットはあるだろう.情報,数学などに精通し,日ごろからtex,rを用いている学生,研究者には便利だと思うが,入学直後の学生に対する情報リテラシーには向かないかも.
markdownはhtml文書へ変換できるフォーマットなのでhtmlで書くより楽.r-markdownの出力はhtml,pdf,word,latexなどを選択できるが,ここでは一般的なhtmlとした.r-markdownは
からなり,knit(ニット)で出力(レンダリング).
ネットには関連する各種のコードの例が載っているが,パッケージのバージョンの違い,パッケージ間のコンフリクトなどによりすぐに使えない場合が多く,結局試行錯誤するしかない.
凝った文書スタイルにするためには,cssファイルを別途用意してそこ書き込むか,定型のスタイルファイル,たとえばrmdformatsにあるいくつかのスタイルが参考になる.
ドキュメント+計算を可能にする例(上記ホームページを参照)
ヘッダは文章のスタイルを決めるもので,RStudioでr-markdownのファイルを開くとデフォルの設定になっているが,必要に応じて設定を追加して,
: "1. 環境とフォント"
title: "松葉"
author: "更新:`r Sys.Date()``" #`r コード`はrのインライン実行
date:
output: # htmlで文章を作成
html_document: "mystyle.css" # 独自の書式をcssで設定する場合
css: 11pt # htmlでは効かない
fontsize: yes # 目次の有無
toc-includes: # texのプリアンプル
header \usepackage{graphicx,amsmath}
のようにする.outputがhtmlの場合はfontsizeが効かないように,ヘッダーだけでは文章のスタイルをすべて設定することはできない.体裁を変更するには,
markdown(ヘッダ)
css:htmlのタグで囲んだ範囲の文字の色,大きさ,背景の色や配置などを指定
html:微調整
を利用するが,設定の優先順位など相互にどのような関係にあるのか不明(あまり実践がないので).
ここでは,cssファイル(上記の例ではmystyle.cssとしたテキストファイル)をRmdファイルと同じフォルダに用意しておき,
body{ # 文章のスタイル
font-family: 'MS PMincho'; # 明朝体
font-size: 11pt; # 文字の大きさ
}
h1.title { # h1のtitleのスタイル
text-align: center;
font-size: 38px;
color: DarkRed;
border: None;
background: None;
}
h1 { # h1のスタイル
text-align: left;
font-size: 16pt;
font-weight: bold;
padding: 0.3em 0.3em; #文字の上下左右の余白
color: #494949; #文字色
background: #f4f4f4; #文字色背景色
border-left: solid 5px #7db4e6; #左端の線
border-bottom: solid 3px #d7d7d7; #下線
}
のように記述する.通常のテキストの書体はデフォルト(markdownではテキストの色は変更できない)で決まっているが,いくつかの方法で独自に指定できる.
<p style="font-family: 'Times New Roman','MS PMincho'; font-size:12pt; font-style:italic; color: red"> これは個人的なNote </p>
これは個人的なNote
チャンクは一つの計算単位であるが,それぞれにオプションが設定できる.すべてのチャンクにオプションを設定するには,ヘッダに続いて,
```{r setup,include=FALSE} # include=FALSEで文書に載せない
library(tidyverse) # モデル化,視覚化等(ggplot2も含む)
knitr::opts_chunk$set(
echo=TRUE, # チャンク表示の有無
eval=TRUE, # チャンク実行の有無
warning=FALSE, # 警告表示の有無
message=FALSE, # メッセージ表示の有無
fig.height = 4/1.63, # 図の高さ
fig.width = 4, # 図の幅
fig.align = "center", # 図の位置
class.source="bg-success", # チャンクの背景色
class.output="bg-warning" # 計算結果の背景色
)
knitr::knit_hooks$set(small_mar=function(before,options,envir) {
if (before) {
par(mar=c(4,4,0.1,0.1)) # 上右側マージンを小さく設定
par(bg="white") # 背景色
}
},
webgl = hook_webgl)
```
とする.rのパッケージは予めインストールしておく(あるいインストールを促される).knitr::opts_chunk$set
は,チャンクと計算結果の表示に関する一括設定.knitr::knit_hooks$set
も同じようであるが,チャンク実行前後の出力の調整などを行う関数の設定.
tex記法($数式$
)に準ずるが,凝るならば少々手直しがいる.たとえば,
正規分布にしたがう確率変数\(X\)は\(X \sim N(\mu,\sigma^2)\)と表す.
から分かるように,Microsoft Edgeで開いて確かめると,文字の大きさが多少気になる.cssでは数式のみの大きさが調整できない?そこで,$\small 数式$
とすると,
正規分布にしたがう確率変数\(\small X\)は\(\small X \sim N(\mu,\sigma^2)\)と表す.
とほぼ大きさが揃う?.
htmlで修正する場合は,<span style="font-size:9pt">文字</span>
とすれば,
正規分布にしたがう確率変数\(X\)は\(X \sim N(\mu,\sigma^2)\)と表す.
\[ f(x) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left\{-\frac{(x-\mu)^2}{2\sigma^2}\right\} \qquad A = \begin{pmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{pmatrix} \] r-markdownの表(体裁は自由に変更できないようである)の中に入れる
\(x \quad \hat{x} \quad \alpha\) | \(\boldsymbol{x}_k\) | \(x,y,z\) | \(\dfrac{a}{b}\) | \(\displaystyle\binom{n}{k}\) |
\(\sum_{k=1}^n x_k\) | \(f(x) = \frac{1}{\sqrt{2\pi}\sigma} \exp\left\{-\frac{(x-\mu)^2}{2\sigma^2}\right\}\) | \(A = \begin{pmatrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{pmatrix}\) | \(\int_a^bf(x)dx\) | |
\newcommand{\combi}[2]{{}_{#1} \mathrm{C}_{#2}}%組合せ記号
と定義して$\combi{n}{m}$
とすると,
\[{}_{n} \mathrm{C}_{m}=\dfrac{n!}{m!(n-m)!}\]
2Dグラフ
準備した時系列データの構造を調べておく.
<-ts(c(7.1,7.9,9.1,10.3,12.1,14.6,17.4,20.2,23.0,26.8,29.1,30.3,31.6,33.4,36.1),start=c(1970),frequency=1/5)
agingstr(aging)
## Time-Series [1:15] from 1970 to 2040: 7.1 7.9 9.1 10.3 12.1 14.6 17.4 20.2 23 26.8 ...
と,rでの時系列データの表し方に注意.
windowsFonts(myFont="MS Mincho")
#ts.plot関数
ts.plot(aging,xlim=c(1970,2040),ylim=c(0,40),gpars=list(pch=19,lty=1,type="o",family="myFont",cex.lab=0.5,xlab="西暦",ylab="高齢化率"))
#ggplot2を用いたautoplot関数
autoplot(aging,geom="point",xlab="西暦",ylab="高齢化率")+
scale_x_continuous(breaks = seq(1970,2040,20))
plotでも若干違いがあるが,ts.plotと同じようなグラフ.一方.autoplotはggplot2を使った表示.オプシンの設定でいろいろ変更できる.
3Dグラフ(回転)
エクセルファイルからデータを読み込む場合.
<-read.csv("プロ野球勝敗表2009-2015.csv", fileEncoding = "CP932")
work<-data.frame(
baseball=work[,4],
得点=work[,5],
失点=work[,6]
勝率
)plot3d(baseball,type="s",radius=7,col=ifelse(baseball[,3]>0.5,'red','black'),
xlim=c(350,800),ylim=c(350,800),zlim=c(0.3,0.7),cex.lab=0.3)
下記の例は線を引く関数linesを用いた例.
=function(m,x=0,y=0,t=0,L=1) {
kochif(m==0) {
lines(c(x, x+L*cos(t)), c(y, y+L*sin(t)))
else {
} koch(m-1,x,y,t,L/3)
koch(m-1,x+(L/3)*cos(t),y+(L/3)*sin(t),t+pi/3,L/3)
koch(m-1,x+(L/3)*(cos(t)+cos(t+pi/3)),y+(L/3)*(sin(t)+sin(t+pi/3)),t-pi/3,L/3)
koch(m-1,x+(2*L/3)*cos(t),y+(2*L/3)*sin(t),t,L/3)
}
}split.screen(c(2,3));
## [1] 1 2 3 4 5 6
screen(1);koch(0);title("m=0")
screen(2);koch(1);title("m=1")
screen(3);koch(2);title("m=2")
screen(4);koch(3);title("m=3")
screen(5);koch(4);title("m=4")
`{r,engine='tikz'}
\begin{tikzpicture}
tikzのコード
\end{tikzpicture}
`
のように書く.
\begin{tikzpicture}[every node/.style={thick, minimum size=1cm}]
\filldraw[color=red!60, fill=red!5, very thick](0,0) circle (2);
\filldraw[color=blue!60, fill=blue!5, very thick](2,0) circle (2);
\node[rectangle,fill=red!20,draw] at (0,0) (A) {$A$};
\node[rectangle,fill=blue!20,draw] at (1,0.75) (B) {$B$};
\node[rectangle,fill=green!20,draw] at (2,0) (D) {$D$};
\node[rectangle,draw] at (1,-0.75) (C) {$C$};
\end{tikzpicture}
一旦図をpdfファイルとして出力し,それをr-markadownに取り込んでいるようである.
r-markdown記法
$\frac{3}{4}$
とすると\(\frac{3}{4}\)のように文章文字よりも大きい.$\small \frac{3}{4}$
とすると\(\small \frac{3}{4}\)となる.文字の大きさを色々変えて数式を表示せよ.<font size="4">文字</font>
で可能だが,文章全体にわたってはヘッダーにcss: style.css
としてcssファイルを別途作る.<span style="color: red">インライン</span>
とすれば,インラインとなる.問題
Rのバージョンは
c(R.Version()$platform, R.Version()$version.string)
## [1] "x86_64-w64-mingw32" "R version 4.0.4 (2021-02-15)"
である.Rのバージョンはしばしば更新されるので,最新バージョンを確認しよう.Rのライセンスの詳細はlicence()で見ることができる.ただし英文で,またオンラインマニュアル等も英語で書かれているが,研究者や大学院生が使うことが前提であれば問題ないが,学部生には少々困難かも.
Rのバージョンはを起動すると,入力(コンソール)画面が現れる.エディタ-(スクリプト)を開いて,コードを記入して,Ctrl+Rで実行すると,コンソール「>」にそのコードが入力され実行される.コンソールに直接入力できるがエディタ-機能がないので,使いづらい.さらに,データ等を表示するためのグラフィックスは別の出力画面(デバイス)がある.合計三つの画面があり,これだけで使う気になれない.もっとも,Rには豊富な統計処理が装備されているので使っているが,商用のソフトとは違い,不便さは我慢するしかない.
このメモはRStudioとう便利なインターフェースを用いれいる.コンソール,エディタ-,出力画面が同じ画面上に現れるので便利であるが,基本的にはRそのもので,RStudioをRを前提にしているので,まずRをインストールしておかなければならない.
Rをインストールすると,すでにインストールされている基本的なパッケージがあり,各種の基本的な関数が入っている.それ以外の用途に応じたパッケージは,必要に応じて別途インストールしなければならない.インストール済みの全てのパッケージは,library()と入力すると,別画面「利用可能なパッケージ」にその一覧が現れる.パッケージをインストールするとはCRAN(Japanミラーサイトを選択)からダウンロードしてコンピュータの適当なデイレクトルに保存することである.そのパッケージを実際に使うためにはlibraryで実行可能な状態にしなければならない.一度インストールしておけば,あとは実行可能な状態にするだけである.たとえば,Aというパッケージを初めて使うためには,
install.packages("A")
library(A)
とする.2回目以降はlibrary(A)だけでよい.これと同じ動作は,起動したときの画面上でもできる.前者ではメニューの「パッケージ」→「パッケージのインストール」でCRANからAをダウンロードし,後者では「パッケージ」→「パッケージの読み込み」でAを選択する.
最も基本的なBaseパッケージに入っているものの一覧は,
print(library(base),quote=FALSE)
## [1] leaflet rgl gridExtra forcats stringr dplyr purrr
## [8] readr tidyr tibble tidyverse knitr ggfortify ggplot2
## [15] stats graphics grDevices utils datasets methods base
である.この中にあるstatsを調べるため,
library(help="stats")
とすると,別画面「パッケージstatsのドキュメント」には各種の統計処理用のプログラムが表示される.たとえば,「AIC Akaike’s An Information Criterion」は赤池の情報量基準,「lm Fitting Linear Models」は線形回帰モデルのように,どのような関数が入っているかはその略称あるいは名前からなんとなく分かるものが多い.通常使う統計プログラムはたいていこの中にある. 続いて,
library(help="graphics")
とすると,別画面「パッケージgraphicsのドキュメント」には各種のグラフが表示される.最も基本的なものに「plot Generic X-Y Plotting」がである.しかし,ヒストグラムを描くプログラムは見当たらないが,plotが(x,y)座標を与えて散布図等を描くこのplotは,ヒストグラムを描くためにもプログラムでもある.plotはよく用いるので,その使い方は十分に習得しておこう. 最後に,
library(help="base")
を調べておこう,別画面「パッケージbaseのドキュメント」には各種の基本的な関数が表示される.たとえば,dateは現在の日付と時刻,eigenは固有値,sumは和,solveは連立一次方程式の解法,などである.
search()は現在読み込まれている(ロード済み)パッケージの一覧を表示するコマンドである.Rを起動した時点では,読み込まれている(ロード済み),つまり実行可能なパッケージの一覧は,
search()
## [1] ".GlobalEnv" "package:leaflet" "package:rgl"
## [4] "package:gridExtra" "package:forcats" "package:stringr"
## [7] "package:dplyr" "package:purrr" "package:readr"
## [10] "package:tidyr" "package:tibble" "package:tidyverse"
## [13] "package:knitr" "package:ggfortify" "package:ggplot2"
## [16] "package:stats" "package:graphics" "package:grDevices"
## [19] "package:utils" "package:datasets" "package:methods"
## [22] "Autoloads" "package:base"
となっている.この時点で実行可能なパッケージはbaseの中の7個である.次に,いくつかのパッケージを読み込んでみよう.例えば,よく用いられるパッケージで,デフォルトのgraphicsよりも綺麗な,また複雑な図が描ける
library(ggplot2)
を読み込んでみよう.すると,
search()
## [1] ".GlobalEnv" "package:leaflet" "package:rgl"
## [4] "package:gridExtra" "package:forcats" "package:stringr"
## [7] "package:dplyr" "package:purrr" "package:readr"
## [10] "package:tidyr" "package:tibble" "package:tidyverse"
## [13] "package:knitr" "package:ggfortify" "package:ggplot2"
## [16] "package:stats" "package:graphics" "package:grDevices"
## [19] "package:utils" "package:datasets" "package:methods"
## [22] "Autoloads" "package:base"
となって,ggplot2が追加されていることが確認できる. なお,追加したパッケージggplot2に関して調べたいときは,読み込んだ後に,?ggplot2あるいはhelp(ggplot2)とすれば,英文のドキュメント(PDF)が現れる.また,このようなパーケージの開発者自身による解説書「Rグラフィックスクックブック-ggplot2によるグラフ作成のレシピ集,オライリージャパン,2013年」もあるので参考になる.
作業しているホーディレクトリは,
getwd()
で分かる.コンソール画面でメニューの「ファイル」から「ディレクトリの変更...」を選択しても分かる.
また,そこでディレクトリを変更することもできる.プログラムやデータを保存するために別のディレクトリにまとめたい場合など,変更した方が分かりやすいこともあるだろう.その場合には作業ディレクトリを変更する.同じ事をコンソールのコマンドで指定することもできる.この場合は.まずtcltkパッケージを読み込んで,
library("tcltk")
setwd(paste(as.character(tkchooseDirectory(title="保存先を選択"),sep="",collapse="")))
とすると,開いたウィンドから選択して,フォルダーを指定する.
RStudio,Rの記法
問題
グラフに数式を表示させる場合など,チャンクでは数式フォントなど少々工夫しないとtexのようにはならない.
rで計算結果のグラフを作成しそれをwordやtexに貼り付けるのが一般的な使い方であろう.通常,rで文書まで作成することは前提にしないが,r-markdownではそうである.従って,日本語フォントはwordやtexのようには使い勝手はよくなく,十分整備されていないが,計算結果を資料とする場合,グラフの凡例などに日本語フォントを使いたいものである. 標準で出力画面用のフォントとして,
str(windowsFonts())
## List of 4
## $ serif : chr "TT Times New Roman"
## $ sans : chr "TT Arial"
## $ mono : chr "TT Courier New"
## $ myFont: chr "MS Mincho"
が定義されている.serifという名前で,英語フォントのTimes New Romanが登録されている.TTはTrueTypeの略で,boldとかitalicなどの指定はない.英文ならこれで十分かもしれない.例えば,serifつまりTimes New Romanフォントでは,
par(mar=c(0,0,0,0))
plot.new()
text(0.2,0.8,"matsuba 0123",family="serif",cex=2,pos=1)
windowsFonts(myFont="HGS行書体")
text(0.6,0.8,"松葉 0123",family="myFont",cex=2,pos=1)
のようになる.familyにはフォントserifを設定する.cexは文字の大きさの倍率.なお,最初にtextだけ入力しても何も表示されない.plotは一般的なグラフを描くための関数であるが,ここでは,何も描かない白い画面(大きさは横縦ともに1)だけを表示する.その後でtextで文字をその上に書く.同じ位置にtextで別の文字を描くと,重ね書きする.plot以外の方法もあるので,それについては以下で説明する.
日本文の場合は英文用のフォントだけでは不十分である.必要に応じて,使用したい日本語フォントをwindowsFonts()を使って新たなフォントファミリーを適当な名前で登録し,その後で作図関数やグラフィックスパラメータのfamilyで引用する.上の例では,HGS行書体はWindowsのFontsディレクトリに登録されている.最初にmyFont(なんでもOK)という名前でHGS行書体を登録しておいて,textではfamily=“myFont”で指定する.なお,ここでは,先の例より簡単な方法であるplot.new()を用いた.その他のwindowsのフォントをいろいろ試してみたが,すべてが正しく表示されないようである.
最後にもう一例
windowsFonts(myFont="Georgia Italic")
par(mar=c(0,0,0,0))
plot.new()
text(0.5,0.8,"0123 abcdefg",family="myFont",cex=2,pos=1)
物理の教科書などで重力の記号としてgが用いられるが,gのイタリック体は教科書のようなgにならなく困ることがある.いくつかあるが,ここではGeorgia Italicを使った.
通常,報告書や論文で使うフォンは,MS明朝体,MSゴシック体の日本語フォントと,Times New Roman,数式でよく用いるsymbolが多いであろう.そこで,
windowsFonts(JP1="MS Mincho",JP2="MS Gothic",
JP3="Times New Roman",JP4="symbol")
と定義する.文字を書くための関数
<-function(x,xp) {
jtexttext(xp,0.6,x,cex=1.25,font=1,pos=3) #標準
text(xp,0.4,x,cex=1.25,font=2,pos=3) #太字
text(xp,0.2,x,cex=1.25,font=3,pos=3) #斜体
text(xp,0.0,x,cex=1.25,font=4,pos=3) #太字斜体
}
と定義しておく.fontの意味は,font=1は標準体,font=3は斜体などである.
<- function(x) {
jfont plot.new()
lines(c(0,1),c(1,1),col="black",lwd=2)
lines(c(0,1),c(0.8,0.8),col="black",lwd=1)
lines(c(0,1),c(0.0,0.0),col="black",lwd=2)
par(family="JP1")
text(0.1,0.8,"明朝",cex=1.5,font=1,pos=3)
jtext(x,0.1)
par(family="JP2")
text(0.35,0.8,"ゴシック",cex=1.5,font=1,pos=3)
jtext(x,0.35)
par(family="JP3")
text(0.6,0.8,"Times",cex=1.5,font=1,pos=3)
jtext(x,0.6)
par(family="JP4")
text(0.85,0.8,"Symbol",family="JP3",cex=1.5,font=1,pos=3)
jtext(x,0.85)
}par(mar=c(0,0,0,0))
jfont("松葉0123abcd")
次に数式の場合を考えよう.数式を書く場合,\(\frac{1}{\sqrt{2πσ^2}}e^{-(x-μ)^2/(2σ^2)}\)(これはtexで表示)のように表したいものである.Rと比べよう.
par(mar=c(0,0,0,0))
plot.new()
text(0.1,0.5,expression(paste(frac(1,sqrt(2*symbol(p)*symbol(s)^2)),e^{-frac((x-symbol(m))^2,2*symbol(s)^2)})))
text(0.4,0.5,expression(paste(frac(1,sqrt(2*pi*sigma^2))," ", italic(e)^{-frac((italic(x)-mu)^2,2*sigma^2)})),family="JP3")
①フォントfamilyを指定しなければ,Timesにならない(左の数式).
②シンボル文字は例えば,symbol(p)でもsigmaとしても同じ.
③個別文字の斜体はitalic(x)で指定する.italic(sigma)としもσの斜体にはならない.
④文字間のスペースは0なので,見栄えよい数式にするためにはスペースを具体的に" "のように指定しなければならない.
もう一例示しておく.
windowsFonts(JP3="Times New Roman")
par(mar=c(0,0,0,0))
plot.new()
text(0.5,0.5,expression(paste(frac(1,italic(n))," ",sum(italic(x)[italic(i)],italic(i)==1,italic(n)))),family="JP3")
数式の記法としてはtexに慣れている方は多いと思う.その記法を上記plotmathの記法に変換してくれるteX()という関数がパッケージlatex2expにより提供されている.これはあくまでplotmathの枠内で数式を書くものであり,新しい機能を追加するものではないが,plotmathの独自記法を覚える必要がないという点で便利である.
install.packages("latex2exp")
library(latex2exp)
詳細はGitHubのstefano-meschiari/latex2expに解説がある. これを使えば,このページの最初の例は次のように書くことができる。\(バックスラッシュ)は2重に書く必要がある.
library(latex2exp) #パッケージの読み込み
par(mar=c(1,1,1,1))
plot.new()
text(0.5,0.5,TeX("$\\frac{1}{\\sqrt{2\\pi\\sigma^2}}\\exp^{-\\frac{(\\mathit{x}-\\mu)^2}{2\\sigma^2}}$"),family="JP3")
ただし,ここでも文字は自動的にはイタリック体にならないので,明示的に\mathit{x}のように書く必要がある.
Googleが定義したGoogle Fontsも利用できる.まず,install.packages(“showtext”)しておこう.ただし,フォントを保存して使う場合でなければ,ネット接続が必要.
例えば,GoogleのGreat Vibes書体などを用いると,
library(showtext)
font_add_google("Great Vibes")
font_add_google("Kosugi Maru")
par(mar=c(0,0,0,0))
plot.new()
showtext_auto()
text(0.4,0.3,"matsuba 0123",family="Great Vibes",cex=3)
text(0.4,0.7,"松葉 あいうえお matsuba 0123",family="Kosugi Maru",cex=2)
ここで,チャンクのオプシンfig.showtext=TRUEは必須.日本語に関して言えば,Google Fontsにある“Noto Sans JP”, “Noto Serif JP”, “M PLUS 1p”, “M PLUS Rounded 1c”, “Kosugi”などは利用できるが,その他はなぜかエラーとなって利用できないものが多い.