niszetの日記

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

(R) reprexパッケージでfile読み込む場合の注意点

ファイル読むときも{}で囲う必要がある

先日、Rスクリプトreprexパッケージを使って表示させようと思って実行してみたところ、

> reprex::reprex(input="igraph_test.R")

Rendering reprex...
Error: Functions that produce HTML output found in document targeting markdown_strict output.
Please change the output type of this document to HTML. Alternatively, you can allow
HTML output in non-HTML formats by adding this option to the YAML front-matter of
your rmarkdown file:

  always_allow_html: yes

Note however that the HTML output will not be visible in non-HTML formats.

In addition: Warning messages:
1: In readLines(path) : incomplete final line found on 'igraph_test.R'
2: In grepl("#+ reprex-setup", data$body, fixed = TRUE) :
  input string 1 is invalid in this locale

こんなエラーが。これに地味に時間を食われました。ので、メモ。

reprex::rexprex()で入力をファイルにする場合、その全体が{} で囲われている必要があります。実際に実行した結果にはコードも表示されるので、結果だけ書けば

{
library(igraph)
library(tidyverse)

df <- data.frame(from=c(1,2,2,2,3,3,4), 
                 to=c(2,1,3,4,2,4,3), 
                 weight=c(0.7,1.3,1.7,0.7,1.7,1.7,1.2))

g <- igraph::graph.data.frame(df)

igraph::shortest.paths(graph = g, mode="out")}
#> 
#>  次のパッケージを付け加えます: 'igraph'
#>  以下のオブジェクトは 'package:stats' からマスクされています: 
#> 
#>      decompose, spectrum
#>  以下のオブジェクトは 'package:base' からマスクされています: 
#> 
#>      union
#>     1   2   3   4
#> 1 0.0 0.7 2.4 1.4
#> 2 1.3 0.0 1.7 0.7
#> 3 3.0 1.7 0.0 1.7
#> 4 4.2 2.9 1.2 0.0

Created on 2018-07-28 by the reprex package (v0.2.0).

みたいになるわけです。気を付けよう。

また、これはファイルを入力する場合に限らないですが、画像はuploadされてしまいます。
先のコードにplot(g)と入れると、下記のファイルへのリンクが出力されます。

https://i.imgur.com/5C6PtcX.png%29

なので、外に出してはいけないデータでreprex()するのは控えたほうが良いですね。問題を再現できる最低限のコードと疑似データで実行する必要があるということですね。こちらも気を付けよう。

Enjoy!!

(R) Contributorになりたい

と書くと格好良いけど…

typoとか、Helpの間違いっぽいもの、変な挙動を見つけたときに報告くらいは出来るようにしておきたいなぁ、と思っていまして1

で、探していたら、

Contribute to the tidyverse - Tidyverse

を見つけて。別にすぐさまコード書いてPR出す必要はないぽいですね。直すべきって思われてから初めてコードを書く必要があるので、いきなり書く必要はないのだ、ということでした。まぁそのほうがこっちもありがたいかな…。

大切なのはバグが「再現可能」であることが大事なようです。報告からバグフィクスにすぐに手を付ける場合もあれば、数か月先になることもあるので、どのような環境で起こるのかがわかるのは大事、ですね。

そしてこれに関連したid:yutannihilationさんとid:u_riboさんの投稿を読んで、reprexパッケージ大事だな…というか実行結果は勝手にコピーされるんですね。知らなかった…。

notchained.hatenablog.com

uribo.hatenablog.com

パッケージによってガイドラインは違うようですね。Code of Conductとかも書かれているものは目を通しておくとよいのかな。

いつか来るその日に、備えよう…。

Enjoy!!


  1. 英語力の問題はいったん置いておくこととする。

(R) remotesパッケージ(メモ)

最近、他のパッケージのインストール方法として見ることが多くなった気がしませんか?

そうでもないですかね?

CRANにもある

CRAN - Package remotes

GitHub版はこちら。 github.com

説明には

Download and install R packages stored in GitHub, BitBucket, or plain subversion or git repositories. This package is a lightweight replacement of the install_* functions in devtools. Indeed most of the code was copied over from devtools.

とあるように、devtoolsパッケージから切り出した形のようです(が、devtoolsの方がなくなったわけではない)

ちょっと確かめてみると、

identical(remotes::install_github, devtools::install_github)
#> [1] FALSE

となります。あれ…?

先日のdiffobjパッケージを使って比較してみましょうか。

ibrary(remotes)
diffobj::diffObj(remotes::install_github, devtools::install_github)

結果は

f:id:niszet:20180728205333p:plain となり、微妙に差異がありますね。

devtoolsの方からなくなることはないとは思いますが(remotesの方に全て機能を移し替えたらwrapperとして動く可能性はある)、単にリポジトリからインストールするだけの目的であればremotesパッケージだけ入れる、というのもありかもしれませんね(devtoolsパッケージはそれなりに重いので)

Enjoy!!

(R) browseVignettes() を使えばパッケージ名だけでVignettesが見れる…

知らなかった…。

普通に知らなかった…。vignette() って関数あるけど、vignette名がわからないと見れないじゃないですかーヤダーとか思っていました。

R: List Vignettes in an HTML Browser

たとえば

browseVignettes("dplyr")

と打てば、ブラウザが立ち上がって

f:id:niszet:20180724234007p:plain

のように見ることができます。大変便利ですね。

Vignettes、動くサンプルとして(たまに更新抜けてて動かないこともあるが)非常に良い勉強材料なので、是非見ていきましょう。

Enjoy!!

(R) Rにも予約語があったんですよね…。

すっかり存在を忘れていた。

みなさんは、コンソール上で

help(function)

と書いてヘルプが出せない…!?と思ったことってないでしょうか?ないかな…

こうすれば見れます。基本的にRは`をつければなんとかなるということを覚えておくと役に立つことがあるかも。

help(`function`)

で、これをツイッタで呟いていたらホクソエム親分から、

と。おぉ。すっかり存在を忘れていた予約語…。Rにもあったのか…

予約語 | R プログラミング解説

パンダ本4章読み直して、理解が深まったらまた書きます。

なぜか長らく投稿してなかった(原稿書いたまま寝てた[^1])のですが、放出! [^1]:たぶん、パンダ本を読み返せてないから。。。

Rの基本的な文法、調べようと思うと結構難しい(情報が少ない、あるいはバージョンアップで変わったもの、そもそも難解な仕様がある、など)のですよね。時間をとって基礎からみっちりやりたい…

Enjoy!!

(R) igraphパッケージを使って最短経路探索をweightつきで計算する。

探してもドンピシャの結果がなかったので自分で書くしかない

追記

Twitterの自動投稿を見て気づいたんですが、「最短経路探索」って書いてありますが、実際には経路を探索はしていなくて、この場合は任意の2点間のコストを最小にする経路を通った時のコストが返ってきています。なので、最短経路は探索していますが、経路そのものはわからず、最小のコストだけがわかる、ということです(タイトルはまぁどっちともとれるから変更せずで良いかな…)。紛らわしいので追記しました。


本題

さて、任意の2点間の経路の最短経路を見つけたい、ただしそれぞれの経路には向きがある上にweightが設定されているものとする。任意の2点間を結ぶ経路は直接でもよいし、ない場合はほかの点を経由してもよい。とにかくたどり着けばよく、その中で経路のコストが最小の値を知りたい、ということが目的です。

# 準備
library(igraph)
library(tidyverse)
library(ggraph)

# data.frameを作る
df <- data.frame(from=c(1,2,2,2,3,3,4), 
                   to=c(2,1,3,4,2,4,3), 
                   weight=c(0.7,1.3,1.7,0.7,1.7,1.7,1.2))

# data.frameからigraphのオブジェクトを作成する
g <- igraph::graph.data.frame(df)

# igraphオブジェクトを可視化
plot(g)

f:id:niszet:20180728203901p:plain

# igraphオブジェクトをDiagrammeRパッケージに渡して可視化
DiagrammeR::visnetwork(DiagrammeR::from_igraph(g))

f:id:niszet:20180728204028p:plain

# ggraphパッケージで可視化
ggraph(g) + geom_edge_link(aes(colour = factor(from))) + 
  geom_node_point()

f:id:niszet:20180728204513p:plain

# 経路を探索してもらう
igraph::shortest.paths(graph = g, mode="out")
#>     1   2   3   4
#> 1 0.0 0.7 2.4 1.4
#> 2 1.3 0.0 1.7 0.7
#> 3 3.0 1.7 0.0 1.7
#> 4 4.2 2.9 1.2 0.0

こんな感じでweightつきの経路探索ができました。実際に使いたいのはもっと多くの地点があるケースなので手作業で網羅するのが大変なので、このパッケージすごい便利だなぁと思った次第です。

graph系は可視化は沢山見かけるのですが、こういう計算系があまり見つからない気がしますね…。まぁ、関数1つで結果が出るので書くほどでもないからだろうか…。

igraphパッケージ、関数沢山あるので使いこなせれば便利かもしれませんね(難しそう)

Enjoy!!

技術書典5に参加します

まさかの当選…。

そんなわけで、技術書典5に当選してました!

f:id:niszet:20180801231803p:plain

これから頑張って作っていこうと思います。内容は大幅に変わるかもしれませんが…。あと、サークルカットとかどないしよ…。 技術同人誌を書こうを読み直して準備しなくては…。

Rについての技術同人誌が全然ないので、盛り上げていきたいところ…。が、Rに関する商業誌は毎年どころか毎月のように出ている昨今ですので、基本的には商業誌では書かれないだろうなぁ(需要がないという意味)で、好きなことを書こうと思います!

ラズパイでLチカするとか… niszet.hatenablog.com

R Studio IDEの話とか…View()とか… niszet.hatenablog.com

skimrパッケージの話とか… niszet.hatenablog.com

今までもマニアックな?話しかしてませんね…。まぁ、気の向くまま書いてみようと思います。がんばろー。

ちなみに↑に書いた内容を書くかどうかは未定です!(ブログの内容を再編・加筆すれば一冊できそう…