niszetの日記

細かい情報を載せていくブログ

(R調べもの) broom::tidyとかtidyMCMCとか (7/26 追記)

僕のTokyoRは終わっていない…

なぜなら復習をしていないからです。前回の日記の末尾に書いたものは何だったのか。

気を取り直して。

R for Data Scienceを読みましょう

TokyoRでも話がちょっと出ていましたが、R for Data Scienceの和訳が出るのはいつになることか。
いっそ、原著を買って読みましょう。私は3か月前に読み終えました^^
久々にページを開き、ほとんど忘れていることを確認済みです。

オライリーはもう直販しないんですっけ?
まぁ、amazonで購入できますので(私はamazonで購入しましたが、届くまでにやたら待ちました…)

shop.oreilly.com

また、こちらでも読むことが出来ますよ。

r4ds.had.co.nz

broomパッケージ

tidyverseには色々なパッケージが含まれています。tidyrとかreadrとかpurrrとか、ggplot2とかいろいろ。
でも、modelrやbroomって全然話題に上がりませんよね。

と思って検索したら…

notchained.hatenablog.com

そして

uribo.hatenablog.com

やはり情報が早い…。
しかしめげずに書かれていないことを探して書くのです。

broom::tidy

uryuさんの記事にもありますが、broom::tidyという関数があります。これは、lmやglmなどのclassをもったデータ(結果)をtidyにしてくれるというもの。戻り値は必ずdata.frameになるとのこと(ヘルプより)
いちいち結果をパースしなくてよいので便利ですね。t.testとか、wilcox.testの結果にも使えるようです。glanceとかaugmentなどもよさげです。
この辺りはリンク先やヘルプを見ると良いのです。追加で書くことは特にないのです。

で、色々見てる中でちょっと気づいたのですが、broom::tidyMCMCという関数があるのです。
これね。

www.rdocumentation.org

犬四匹本もめでたく出版されましたし、MCMC系の結果のtidy化はこれから使いどころがあるかも…?
ということで、ちょっとこの関数を触ってみようと思います。

ちなみに、犬4匹本とはこちらの、

www.kyoritsu-pub.co.jp

のことです。しかしその大きさ、厚さから、犬4匹本はポストに入らなかったために手元にありません…。

tidy化するには結果が必要なため、アヒル本のプログラムを使って作ってstanの結果を作ってみます。

ちなみに、アヒル本とはこちら

www.kyoritsu-pub.co.jp

のことです。Rでstan/mcmc使うならコレ読んどけば間違いないといわれていますね。是非犬4匹本とともにお手元にどうぞ。
階層モデル以降は当時の自分のレベル的にちょっときつかったのですが、今なら行けそうかな…

ヒル本 model4-5のコードを使用します。

載せて良いのか確認とっていないので…プログラムの中身はサポートサイト(とアヒル本)をご参照ください…
今回はfitという変数に結果が入っているので、表示させてみます。

fit

# Inference for Stan model: model4-5.
# 4 chains, each with iter=2000; warmup=1000; thin=1; 
# post-warmup draws per chain=1000, total post-warmup draws=4000.

#          mean se_mean    sd    2.5%     25%     50%    75%  97.5% n_eff Rhat
# a     -117.83    2.12 71.90 -262.76 -165.33 -116.11 -69.52  17.44  1148    1
# b       21.86    0.05  1.61   18.91   20.77   21.81  22.89  25.01  1123    1
# sigma   84.33    0.37 14.71   61.43   73.93   82.12  92.76 118.35  1609    1
# lp__   -93.57    0.04  1.23  -96.74  -94.17  -93.25 -92.66 -92.13   899    1

# Samples were drawn using NUTS(diag_e) at Tue Jul 25 22:54:39 2017.
# For each parameter, n_eff is a crude measure of effective sample size,
# and Rhat is the potential scale reduction factor on split chains (at 
# convergence, Rhat=1).

tidyあるいはtidyMCMCの引数に与えると…

tidy(fit)

#    term   estimate std.error
# 1     a -117.83500 71.896853
# 2     b   21.86044  1.606462
# 3 sigma   84.32789 14.711962

一応、クラスを確認

class(tidy(fit))
# [1] "data.frame"

data.frameですね。

しかし、普通に表示させた結果と比べると物足りないですね。オプションをいじって色々表示させてみます

tidy(fit,estimate.method = "mean", conf.int = TRUE, droppars = NULL, rhat=TRUE, ess=TRUE, conf.level = 0.95, conf.method = "quantile")
#    term   estimate std.error   conf.low conf.high     rhat  ess
# 1     a -117.83500 71.896853 -262.76378  17.44491 1.001971 1148
# 2     b   21.86044  1.606462   18.90667  25.01078 1.001802 1123
# 3 sigma   84.32789 14.711962   61.42625 118.34501 1.000426 1609
# 4  lp__  -93.56818  1.233635  -96.74103 -92.12595 1.004600  899

estimate.methodは"mean"か"median"が指定でき、conf.methodには"quantile"か"HPDinterval"が指定できます。その他、詳細はヘルプを参照下さい。
ただし、上記の結果に対してはHPDintervalは指定するとエラーになります。まだちゃんと理解できていませんが、実行したstanのプログラムがHPDintervalで出力していないからだと思いますが、まだちょっとわかっておりません。。。。

ヒル本著者のberoberoさんによれば、犬4匹本はHDIを使用している、ということなので、そちらで試せばよいのかなと思っています。まだ届いていないけど。 statmodeling.hatenablog.com

既知の情報かもしれませんが、気になったので一応まとめてみました。マサカリ下さいな。

おわりに

本当は、modelrとbroomにあるbootstrap()を調べて書こうと思ったのですが、もうちょっと調べたいのです…
Rは趣味でやっている関係で本業が忙しくなると色々止まります。今はちょっと余裕ある(本当か…?)ので、気になることを調べておきたいですね

追記 7/26

念のための追記。 broomはinstall.packages(tidyverse)で一緒にインストールされますが、library(tidyverse)ではロードされません。明示的にlibrary(broom)としてあげてください。

また、tidyverseに含まれているパッケージの確認は下記のようにすればできます(library(tidyverse)でロードしたあとはtidyverse::は不要です)

tidyverse::tidyverse_packages()
# [1] "broom"     "dplyr"     "forcats"   "ggplot2"   "haven"     "httr"      "hms"       "jsonlite" 
# [9] "lubridate" "magrittr"  "modelr"    "purrr"     "readr"     "readxl"    "stringr"   "tibble"   
#[17] "rvest"     "tidyr"     "xml2"      "tidyverse"

さらに、下記で含まれているパッケージのバージョン、localとcranのものが比較できるようです。

tidyverse::tidyverse_deps()

# # A tibble: 19 x 4
#      package    cran   local behind
#        <chr>   <chr>   <chr>  <lgl>
#  1     broom   0.4.2   0.4.2  FALSE
#  2     dplyr   0.7.2   0.7.2  FALSE
#  3   forcats   0.2.0   0.2.0  FALSE
#  4   ggplot2   2.2.1   2.2.1  FALSE
#  5     haven   1.1.0   1.1.0  FALSE
#  6       hms     0.3     0.3  FALSE
#  7      httr   1.2.1   1.2.1  FALSE
#  8  jsonlite     1.5     1.5  FALSE
#  9 lubridate   1.6.0   1.6.0  FALSE
# 10  magrittr     1.5     1.5  FALSE
# 11    modelr   0.1.1   0.1.1  FALSE
# 12     purrr 0.2.2.2 0.2.2.2  FALSE
# 13     readr   1.1.1   1.1.1  FALSE
# 14    readxl   1.0.0   1.0.0  FALSE
# 15     rvest   0.3.2   0.3.2  FALSE
# 16   stringr   1.2.0   1.2.0  FALSE
# 17    tibble   1.3.3   1.3.3  FALSE
# 18     tidyr   0.6.3   0.6.3  FALSE
# 19      xml2   1.1.1   1.1.1  FALSE

あと、本文中でtidyを使ってstanの結果を見てみましたが、tidyMCMCと比較すると

identical(broom:::tidy.stanfit, broom:::tidyMCMC)
# [1] TRUE

でしたので問題ないかなと。tidyはS3 generic functionなので、クラスがstanfitの場合はtidy.stanfitが呼ばれるのです。

class(fit)
# [1] "stanfit"
#attr(,"package")
# [1] "rstan"

typeof(fit)
# [1] "S4"

is(fit)
# [1] "stanfit"

str(fit)
# 省略

また、

broom::augment(lm(mpg ~ wt, mtcars))
# 途中省略
# Warning messages:
# 1: Deprecated: please use `purrr::possibly()` instead 
# うしろも省略

で、augmentはDeprecated、purrr::possiblyの使用を使えとのことでした。 glanceの方はといえば

 broom::glance(lm(mpg ~ wt, mtcars))
#  r.squared adj.r.squared    sigma statistic      p.value df    logLik      AIC      BIC deviance
#1 0.7528328     0.7445939 3.045882  91.37533 1.293959e-10  2 -80.01471 166.0294 170.4266 278.3219
#  df.residual
#1          30

で問題なく動いているので、一体何が気に入らなかったのかよくわかりません…purrr::possiblyについてはいずれ見てみようかなーと思います。

Enjoy!

第63回 TokyoRに参加してきました。

前回に引き続き,

個人の趣味的な活動として、発表資料等をまとめておきます

資料以外

ATND

第63回R勉強会@東京(#TokyoR) : ATND

togetter

togetter.com

今回、toggetterを私の方で勝手に作ってしまいました。気づいたら手が勝手に…。 一応、ざっくり下記方針でまとめていますが、自分のツイートはまとめから抜いて欲しいとかあればご連絡ください(DMでもなんでも)

発表資料(upされているもの)のリンク

以下、当日使われた資料などのリンクです。初心者セッション


初心者セッション1 Tokyo.R#60 初心者セッション 第Ⅰ部 Rとデータマイニング基礎 Rによる

www.slideshare.net

参考

www.slideshare.net

初心者セッション3 TokyoR:RMarkdownでレポート作成

www.slideshare.net


応用セッション1 Prophet入門【R編】Facebookの時系列予測ツール

www.slideshare.net

応用セッション2 Rを用いたLTV(Life Time Value)の推定

www.slideshare.net

参考

応用セッション3 これからはじめるShiny

これからはじめるShiny

参考

  • u_riboさんのツイートから

LT2 Prophet入門【理論編】Facebookの時系列予測ツール

www.slideshare.net

LT3 useR!2017 in Brussels

www.slideshare.net

LT4 イルカになりたい

www.slideshare.net

LT5 Rによるword2vec

www.slideshare.net

参考

langstat.hatenablog.com

LT6 ggjoyの紹介

speakerdeck.com

参考

r-wakalang


ポエム

資料等は上記のとおりです。ここから先は読まなくて良いですよ笑

資料はまとめてあるとやっぱり良いなーと思ったので勝手にまとめています。前回の資料の記事も閲覧数が凄かったのでやはり需要はあるのかな、と。

wikiを整備するのはブランク20回分をまとめられないなー…ということで保留中。そもそもwikiへログインができないのですが。どこか別の場所でまとめなおすというのもありかもしれません。…という意味ではQiitaでも良いかもしれないですね。あるいはFB(tokyoRでアカウントがあれば、そちらに置いてもらう、など)
とりあえず情報がひとまとめになっていればそれを移動させればよいので、とりあえずここで一旦まとめておきます(直後にやらないと忘れてしまうので)

今回、出席率が高かったらしいです。良かった良かった。

VIP席は快適でした。

今回も楽しかったです。実践をしてこそのTokyoR。午後から色々試してみます。

Enjoy!

coord_polar()+geom_path()で直線を引くには…

注:そのままでは出来ません…

昨日の記事、 niszet.hatenablog.com

について、kohske‏さんから下記のようなアドバイスをいただきました。

ありがたや…

リンク先の記事、

stackoverflow.com

のコードをコピペして動かしてみてください。記事の中で完結しているのでコピペして動かす方が手っ取り早いのです。

coord_polar()改め、coord_radar()を使用してgeom_line()を使ったときにちゃんと直線になることがわかると思います。

昨日の記事に対してやってみる(ただしこちらはデータ順に線を引きたいのでgeom_pathを使用。詳細は前回の記事にて)と、

library(tidyverse)

d=data.frame(height=c(1,2,2,3,4), weight=c(1,3,4,4,2))

dd <- d %>%  mutate(r=sqrt((height^2.0)+(weight^2.0)),theta=atan(height/weight))

p2 = ggplot() +
    geom_path(data=dd, mapping=aes(x=theta, y=r)) +
    geom_point(data=dd, mapping=aes(x=theta, y=r), size=8, fill="white", shape=21) +
    geom_text(data=dd,mapping=aes(x=theta, y=r, label=seq(1,nrow(dd))))

coord_radar <- function (theta = "x", start = 0, direction = 1) {
    theta <- match.arg(theta, c("x", "y"))
    r <- if (theta == "x") "y" else "x"
    ggproto("CordRadar", CoordPolar, theta = theta, r = r, start = start, 
            direction = sign(direction),
            is_linear = function(coord) TRUE)
}

p2 + coord_radar(theta="x",start = -pi/2, direction = -1) +ylim(0,6)+scale_x_continuous(limits=c(0,2*pi),breaks=seq(0,2*pi,by=pi/2))

で、めでたく

f:id:niszet:20170713230612p:plain

を得ることが出来ました。めでたしめでたし。

Coordの中身をちょっと見てみる。

・・・で、終わってしまうのはなんなので、ちょっとcoordの中身を見ていきます。

ggplot2のオブジェクト、関数の中身を見ていく方法については、先日も紹介したkazutanさんのこちらの資料が良いと思います。

ggplotのオブジェクトから眺めてみる

基本はstr()で見ていき、$で要素にアクセスしていきます。
また、関数は()をつけなければ(そしてRで書かれていれば)中身のソースを読むことが出来るので、それらを駆使してみていきます。場合によって、

hoge <- edit(hoge)

のようにして関数を修正して挙動を調べることもできます。今回はやってませんけど…

やってみよう。

さて、上のcoord_radarとcoord_polarの違いは何かといえば、

is_linear = function(coord) TRUE

の有り無しだけです。実際にcoord_polarの中身を見てみると

coord_polar

# function (theta = "x", start = 0, direction = 1) 
# {
#     theta <- match.arg(theta, c("x", "y"))
#     r <- if (theta == "x") 
#         "y"
#     else "x"
#     ggproto(NULL, CoordPolar, theta = theta, r = r, start = start, 
#         direction = sign(direction))
# }
# <environment: namespace:ggplot2>

同じですね。なお、namespaceはとりあえず今は考えなくて良いです。
このis_linearによって、直線になったり、対象の座標軸にそってうねったりするようです。実際にこれを使っている部分はまだ見れていません。課題。

なお、このis_linearはfunctionとして定義しています。実際にやればわかりますがTRUEを代入ではダメです。使う場所でis_linearを関数として呼び出しているためです。
引数のcoordは抜いても動きましたが、副作用がないかはわかっていません。入れておくべきでしょうね。

さて、ggprotoでCoordPolarを渡しているので、次はこれを見ていきます。
こんな感じ。

str(CoordPolar)

# Classes 'CoordPolar', 'Coord', 'ggproto' <ggproto object: Class CoordPolar, Coord>
#     aspect: function
#     distance: function
#     is_linear: function
#     labels: function
#     range: function
#     render_axis_h: function
#     render_axis_v: function
#     render_bg: function
#     render_fg: function
#     train: function
#     transform: function
#     super:  <ggproto object: Class Coord> 

うーむ、よくわからない。わからないが、それぞれの要素に関数が入っていて、親がCoordなのはわかりますね。
このis_linearにアクセスすると、

CoordPolar$is_linear

# <ggproto method>
#   <Wrapper function>
#     function (...) 
# f(...)
# 
#   <Inner function (f)>
#     function () 
# FALSE

で、FALSEが返ってくることがわかります。 後日ちゃんとソース読んで確認しますが、RStudioを使っているとCoordPolar$ まで入力すると補完候補が出ると思います。このときに一覧に出てこないものはこのオブジェクトでは定義されておらず、super(親)で定義されているものが継承されているのだと思っています。

なお、親の親の親の…と先祖をたどっていって、どこかでTRUEが定義されていて、そのあとFALSEで上書きされていなければ、TRUEを返すはず(たぶん)です。
ちょっとこの辺りもちゃんと調べます。課題。

さて、Coord*** 系の、RStudioで入力補完の候補に出てきたものについて、is_linearがT/Fどちらを返すのかを見てみました。

Coord
# Coord系のすべての元になるオブジェクト。FALSEを返す。これがデフォルトの挙動

CoordCartesian$is_linear 
# 唯一、is_linearがTRUEを返す

CoordFixed 
# superがCoordCartesianなので、is_linearも継承。TRUEを返す

CoordFlip
# Coordをそのまま継承。FALSEを返す

CoordMap
# Coordをそのまま継承。FALSEを返す

CoordPolar
# Coordをそのまま継承。FALSEを返す。前回の記事で使用したのはコレ。

CoordQuickmap
# superがCoordCartesianなので、is_linearも継承。TRUEを返す。CoordMapと名前が似ているが中身は違う点に注意が必要かも?

CoordTrans
# Coordをそのまま継承。FALSEを返す

という結果でした。MapとQuickMapで違う、とか、自分でTRUEを返しているのはCartesianだけで、あとはコレを継承しているからっぽい、とかちょっと面白い。 継承~は前記の通り、僕の認識違いの可能性もあるので、ご注意。

まとめ

is_linearについて簡単に調べるだけでもここまでボリュームが…。
…なので、オレオレgeomを作ってみたい!という方は必要になった部分から少しずつ見ていくのが良いと思いました。出来るだけggplot2と真正面から戦わない方が…
今回、サムネイルはちゃんとなっているはず…u_riboさんにアドバイスいただきました。ありがとうございました。

そして、今回はいつもにもまして勢いで書いております。ここ変だよ!とかご指摘大歓迎です。よろしくお願いします。

使っていると段々とわかってきて、わかってくると面白くなってきますね。

Enjoy!!

coord_polarを使ってみる(追記)(修正)

自作geomのその前に

complex型を使う際には何かとcoord_polarの出番が多そう。ということで、ちょっと試してみました。
今回はこちらを参考にしています。

ggplot2 Quick Reference: coord | Software and Programmer Efficiency Research Group

パイチャートというのでしょうか、あの帯状の図は目にするのですが、coord_polarを使用してgeom_lineやgeom_pointを使用している例はあまり見てない気がします。
あたしこのパイ(チャート)嫌いなのよね…

さて、下記コードの前半は上記のサイトからのコピペですが、最後のプロット時にxlim,ylimを与えて、原点が含まれるようにしています。

library(ggplot2)

d=data.frame(height=c(1,2,2,3,4), weight=c(1,3,4,4,2))

p = ggplot() +
    geom_line(data=d, mapping=aes(x=height, y=weight)) +
    geom_point(data=d, mapping=aes(x=height, y=weight), size=8, fill="white", shape=21) +
    geom_text(data=d,mapping=aes(x=height, y=weight, label=seq(1,nrow(d))))

p+coord_equal() +xlim(0,5)+ylim(0,5)

結果はこう。
f:id:niszet:20170712234040p:plain

xlimで(ylim)はなくて、下のようにscale_x**、scale_y**でも良いです。上記のオブジェクトpをstr()など使って見てみるとわかりますが、デフォルトだとlimitsが入ってないのですね。
原点を含みたいのであれば必ずそれが入るようにxlim,ylimを指定してあげればよいということになりますね(max, min の中に0が入っているか?のチェックが必要かな)

さて、coord_polarを使ってみます。

dd <- d %>%  mutate(r=sqrt((height^2.0)+(weight^2.0)),theta=atan(height/weight))

p2 = ggplot() +
    geom_line(data=dd, mapping=aes(x=theta, y=r)) +
    geom_point(data=dd, mapping=aes(x=theta, y=r), size=8, fill="white", shape=21) +
    geom_text(data=dd,mapping=aes(x=theta, y=r, label=seq(1,nrow(dd))))

p2 + coord_polar(theta="x",start = -pi/2, direction = -1) +ylim(0,6)+scale_x_continuous(limits=c(0,2*pi),breaks=seq(0,2*pi,by=pi/2))

f:id:niszet:20170712234747p:plain

geom_lineがなんか変ですが、点については多分意図したものが出来たはず…。最初の図と点の位置はあっている(と思う)ので。
geom_lineはthetaの小さい順につないでいるように見えますね。これは要改良…。

とりあえず思いついたまま書いたのであまり良くないコードになってる気がします。後日清書しよ…

次はこれをcomplex型に使ってみます。今日は時間切れ。日付変わっちゃったけど。

追記(修正)

寝てる間にgeom_lineじゃなくてgeom_pathなら良いのでは?と気づきました。

p2 = ggplot() +
    geom_path(data=dd, mapping=aes(x=theta, y=r)) +
    geom_point(data=dd, mapping=aes(x=theta, y=r), size=8, fill="white", shape=21) +
    geom_text(data=dd,mapping=aes(x=theta, y=r, label=seq(1,nrow(dd))))

p2 + coord_polar(theta="x",start = -pi/2, direction = -1) +ylim(0,6)+scale_x_continuous(limits=c(0,2*pi),breaks=seq(0,2*pi,by=pi/2))

結果はこうです。意図通りっぽい

f:id:niszet:20170713075912p:plain

以下、マニュアルより
geom_path() connects the observations in the order in which they appear in the data.
geom_line() connects them in order of the variable on the x axis.

こちらで全文が見れます。 Connect observations — geom_path • ggplot2

やはり知っているつもりでも、細かいところはこまめにヘルプを見なくてはいけませんね。

(R小ネタ) 前回の続き

小ネタです…

ggplot2のgeom_segmentは、aesとしてx,y,xend,yendをそれぞれ与えることで、各データを(x,y) (xend, yend)を結ぶ線分の形でプロットしてくれるようです。

詳しくはこちらをご参照ください
Line segments and curves — geom_segment • ggplot2

R4DSで使われていたflightsというデータセットがうまく使えそうかな?と思ったのでテストしてみます。

# install.packages("nycflights13")

library(nycflights13)
library(tidyverse)

flights %>%  na.omit() %>% ggplot()+geom_segment(aes(x=arr_time,y=dest,xend=arr_time+air_time,yend=dest))

これで、このような図が作れます。

f:id:niszet:20170711231405p:plain

前回と同じような図が出来ますね。ちょっと棒が長い気がするけど。(ひょっとしたら重なってるかもですね)
もうちょっと良いデータセットを探そうかな…xとxendにdateの方を使えばよい気もしますが…(日付型はちょっと…)

ということで(?)データからMIDIを作る方を今後は作ってみます。関数名はwrite_smf()になりますね。

次回進捗は3か月後かな…。writeはちょっと難しい(smfの仕様の把握が)ので時間がかかりそうです。
tuneRも、midiのreadはあるのですが、writeはないのですよね。なければ作ればいい…。作らなくてもいいけど…

(R進捗)rsound/csound関係進捗(追記)

あまり進捗ないですけど…

csoundと、rsoundと、rcppと…と調べることが広範囲にわたるのであまり進捗がないです。 とりあえず、進んだ分はメモ。

windows版だけかもしれないですが…

先日、rsoundの方でwaveでのファイル出力が出来ることに気づきました。その際、生成したファイルのヘッダにはちゃんとファイルサイズに関する情報が含まれていました。

Csound側で同じコードを実行してもファイルサイズは含まれていなかったで、何かの設定(の抜け)を疑いましたが見つからず。rsoundはcsound APIを呼んでいる形だから、Qtが悪いのでは…と思っています。
RStudio、nvimに続き、CsoundもQtで悩まされるのか…

rsoundで変数を渡す方法

rsoundの方、パラメータをどうやって渡すのかを悩んでいました。csound()は中でas.characterを読んでいるので、その中身を取り出して色々見ていましたが、たとえば周波数440Hzを入力する際に、パラメータとして渡したければ、下記のように`kkk=“=440"とやると良いです。変数名=値の形で与えると、csoundに渡すときに代入文にならないので、=を付けてあげればよいのでした。

orc <- create_orchestra( sr    = 44100,
                         ksmps = 32,
                         nchnls = 2,
                         `0dbfs` = 1,
                         instrument = list(
                             create_instrument(kkk="=440",aout = "vco2 0.5, kkk", outs = "aout, aout"))
)

sco <- create_score(sections = list(
    list(score_i(1, 0, 1))
))

csound_impl(as.character(orc),as.character(sco),paste0("-o","test.wav"))

同様に、これも動きます。

orc <- create_orchestra( sr    = 44100,
                         ksmps = 32,
                         nchnls = 2,
                         `0dbfs` = 1,
                         instrument = list(
                             create_instrument(aout = "vco2 0.5, p4", outs = "aout, aout"))
)

sco <- create_score(sections = list(
    list(score_i(1, 0, 1, 440))
))

csound_impl(as.character(orc),as.character(sco),paste0("-o","test.wav"))

しかしまだ、f系の音が出せていません。うーむ…まだ仕様がわからないのでした。

今後に期待

とりあえず、コードいじらなくてもまだ色々できそうなので、ちょっと試していこうと思っています。csound側の仕様を理解しないといけませんが…。
しかし…日曜にR触ってないで、お料理教室に行った方が…

追記

下記のように記述することで、foscilのサンプルも動きました。力尽きたので、csound()を経由するのはまた後日…?

foscil

eeee <- "0dbfs = 1\nksmps = 32\nnchnls = 2\nsr = 44100\n\ninstr 1\nkcps = 440\nkcar = 1\nkmod = p4\nkndx line 0, p3, 20\naout foscil .5, kcps, kcar, kmod, kndx, 1\nouts aout, aout\nendin"

ssss <- "f 1 0 16384 10 1\n\ni 1 0  9 .01\ni 1 10 .  1\ni 1 20 . 1.414\ni 1 30 5 2.05\ne"

csound_impl(eeee,ssss,paste0("-o","test.wav"))

(R進捗)midiを読んでplotするところまではできた…

残件沢山です

とりあえず、midiを読み、全データを一旦保持しつつ、noteのon/offだけを抜き出してdata.frameとして、ggplot2+geom_segmentで図にするところまでたどり着きました。

結果:

f:id:niszet:20170709122508p:plain

dfはそれぞれの音の高さ、なり始める時間、なり終わる時間などが入っています。geom_segmentはx,y,xend,yendを指定することで、その間に線を引いてくれるようです。欲しかったgeomそのものでした。

ざっくり、下記のようにしてプロットしています。

df %>% ggplot()+geom_segment(aes((x=start_time,y=typexend=end_time,yend=type))

これからまだまだデータ構造含めて修正してしまうので、細かい使い方はまだ書けないです。