knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
library(ggplot2) library(dplyr) devtools::load_all(".") data(my_iris) table_nums <- captioner::captioner(prefix = "Table") table_cap <- table_nums(name = "iristable", caption = "Summary of iris data") fig_nums <- captioner::captioner(prefix = "Fig.") sepal <- fig_nums(name = "sepal", caption = "Length--width relationship of iris sepals by species") petal <- fig_nums(name = "petal", caption = "Length--width relationship of iris petals by species")
かんたんな論文をRパッケージのドキュメントとして書いてみましょう。 この論文自体に学術的価値は全くありませんが、 論文執筆を含む全ての知的労働がソフトウェア開発そのものであることを実感できるでしょう。
我々研究者が特に意識して学ぶべき概念は以下の3つです。
テストは、我々開発者(ここでは著者)がプログラムに対して期待する事項をコードとして表したものです。
違う切り口で解釈すると、テストとは、あなたがそのプログラムによって問題を確かに解決したことを保証するものです。
独自のテストコードを書くこともできますが、既存のテストフレームワークを用いるのが賢明です。
R言語では、プログラムをパッケージとして開発することによって、
testthat
パッケージのテストフレームワークを利用することができます。
ドキュメント生成の必要性を低レベルな観点から説明すれば、「人的ミス混入の余地をなくす上で不可欠」といったところでしょうか。 その恩恵は、ドキュメントの規模が大きくなるにつれて指数関数的に増加します(私の主観です)。 ドキュメント生成の概念がないプロジェクトでは、作業者は不幸にも計算結果を手作業でドキュメントに貼り付けることを強いられます^1。 より高次の観点からの説明はもっと単純です。ドキュメントのソースコードへのコミットは、「本当にそれが」変更された時に限られるべきなのです。
ビルドは、簡単にいえばソフトウェア(ここでは論文)を組み立てることです。 より重要な解釈としては、ビルドが成功したということは(ユーザーが気にいるかどうかは別として)、 提供しようとしている価値を実際に生み出すことができたことを意味します。 また、ビルドの成功は、ソフトウェアがそれまでに書いたテストが全て成功したということを意味します。 論文をソフトウェアとして開発することで、ロジックの組み立てやバグ修正でどんなに疲弊していようと、 品質低下を起こすことなく作業を進めることができます。
「ビルドボタン」は指先一つで価値を創造する強力なツールですが、人間はそれさえ押し忘れてしまう悲しい生き物です。 「ビルドしたかどうかをダブル・トリプルチェックする」というのはどこかの組織が大好きな精神論ですが、 こういったこまごました雑用は全て自動化する必要があります。
継続的インテグレーション(CI: Continuous Integration)は、 いわばリポジトリへに変更がコミットされるたびに、コンピュータが自動的にビルドボタンを押してくれる仕組みです。 それぞれのビルドはリポジトリへのそれぞれのコミットに対応した個別のIDで管理されているため、 もしビルドが壊れた場合、どのコミットが犯人かを特定することができます。
本研究にはirisデータを使いました。
irisデータはr length(unique(my_iris$Species))
種(r unique(my_iris$Species)
)のアヤメについて、花弁と萼片の長さと幅を記録したサンプルデータです。
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
アヤメの花弁と萼片の長さと幅について、種別にまとめました(r table_nums("iristable", display = "cite")
)。
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
r table_nums("iristable")
my_iris %>% group_by(Species) %>% summarize("Sepal Lqength (mm)" = my_range(Sepal.Length), "Sepal Width (mm)" = my_range(Sepal.Width), "Petal Length (mm)" = my_range(Petal.Length), "Petal Width (mm)" = my_range(Petal.Width)) %>% knitr::kable()
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
花弁の長さと幅の関係を調べました(r fig_nums("sepal", display = "cite")
)
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
my_iris %>% ggplot(aes(Sepal.Length, Sepal.Width, color = Species)) + geom_point()
萼片の長さと幅の関係についても調べました(r fig_nums("petal", display = "cite")
)
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
my_iris %>% ggplot(aes(Petal.Length, Petal.Width, color = Species)) + geom_point()
花弁(r fig_nums("sepal", display = "cite")
)および
萼片(r fig_nums("petal", display = "cite")
)の
長さと幅の関係を利用して、種判別ができるかもと思いました。
ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。 ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。ぞうの卵は大きいぞう。
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.