Hatena::ブログ(Diary)

盆栽日記

2016-09-20

Rでリファラを設定してコンテンツを取得する

curlとかwgetだと一行だろうけどRでやりたい。

リファラでアクセス制限をかけている場合のPDFコンテンツの取得の一例を以下に示す。

add_headersでリファラを設定してGETした後、バイナリデータとして書き出せば良い。

library("httr")
u <- "目的とするURL"
res <- GET(u, config=add_headers(`Referer`="求められているリファラ"))
res_pdf <- content(res)
writeBin(res_pdf, "hoge.pdf")

2016-09-14

Shiny-serverでflexdashboardを動かす

Shiny-serverでflexdashboardをデプローイする方法がわからなかったのでメモ。

通常は以下のサイトでも解説されているようにui.Rとserver.Rを所定の場所に設置しておけば、

http://IPアドレス:3838/ディレクトリ名

という形でアクセスできる。

http://estrellita.hatenablog.com/entry/2014/02/28/050500

で、RmarkdownでShinyをインタラクティブなドキュメントを生成する時はどうするか。

公式ドキュメントを読む限り、server.Rの代わりにRmarkdown(Rmd)ファイルを置いておけば認識してくれるらしい。

http://docs.rstudio.com/shiny-server/#r-markdown

ということでflexdashboardも同じやり方でデプローイできる。

まず、必要なパッケージをインストールしておく。

sudo su - -c "R -e \"install.packages(c('rmarkdown','flexdashboard'), repos='http://cran.rstudio.com')\""

あとはflexdashboardのテンプレートで書かれたRmdファイルを用意する。

File→New File→ R Markdownでflexdashboardを選ぶ。

今回は動作確認のため、テンプレートを初期設定のままいじらずそのまま利用することにする。

最後に上記ファイルを所定の場所(server.Rを置く場所)に設置して、通常通り

http://IPアドレス:3838/ディレクトリ名

という形でアクセスすればflexdashboardのアプリが立ち上がる。

繰り返すが、server.Rが同じ場所にあればそちらが優先されるので注意。

2016-09-13

shinyで待ち時間にメッセージを表示する

withProgressが手っ取り早い。

messageにメッセージを指定して、その後に待ち時間が発生する処理をブロックで指定する。

renderText({
  withProgress(message = '計算中', {
    input$hoge
    })
})

参照クラスのProgressを用いるという方法もあるらしい。

http://shiny.rstudio.com/reference/shiny/latest/withProgress.html

2016-09-07

[R]flexdashboardをshinyアプリとしてレンダリングする時はrun

flexdashboardをshinyアプリとしてレンダリングする時はrenderじゃなくてrun。

flexdashboard::flexdashboard()のexampleにはhtmlにレンダリングする例が載っているので間違えがち。

rmarkdown::run("dashboard.Rmd")

ちなみにうっかりrenderすると、以下のようなメッセージが出る。

path for html_dependency not provided

2016-08-19

paste0関数の挙動

こんな話がある。

結論からいえば、三連ドット(...)で引数を受ける+引数のチェックを明示的に行わなかった結果だと思われる。

原因を探る

paste0関数内部をみると.InternalでC実装のpaste0が呼ばれている。

> paste0
function (..., collapse = NULL) 
.Internal(paste0(list(...), collapse))
<bytecode: 0x000000000581fef0>
<environment: namespace:base>

.Internalの中身を見るにはソースを見たらよい。

https://github.com/wch/r-source

names.cを確認すると、C実装のpasteと同様にdo_pasteが呼ばれている。

pasteとの違いはpaste0の場合、offsetが1(pasteは0)でarityが2(pasteは3)という点である。

https://github.com/wch/r-source/blob/48536f1756a88830076023db9566fbb2c1dbb29b/src/main/names.c#L514

offsetは動作を切り替えるフラグであり次のdo_pasteの中ではopとして扱われている。

arityは引数の数を示しており(paste0はlist(...)とcollapseの2つ、pasteはsepが加わって3つ)。

さて、今度は呼ばれるdo_pasteの中身をみてみる。

https://github.com/wch/r-source/blob/trunk/src/main/paste.c#L52

ここではoffset(op)をチェックして0ならばuse_sepがTRUEになる。

つまりpaste0ならuse_sepはFALSEである。

use_sepがTRUEの時はsep引数の値をみて処理を行っているが、

FALSEの時はsep引数にnilを入れるのみでありチェックは行われない。

https://github.com/wch/r-source/blob/trunk/src/main/paste.c#L77

結果として、sepに限らずどんな引数でも渡せるようになっており

冒頭の例の他にも以下のような例でも通る。

> paste0(1,2,yeah=1)
[1] "121"
> paste0(1,2,takayanagi=3)
[1] "123"

三連ドット(...)で引数を受ける+引数のチェックを明示的に行わなかった結果、以上のような挙動になっているものと思われる。

三連ドットは便利だけど、Advanced RのFunctionsの章にもあるように、引数のチェックが行われず思わぬ挙動を示す((

sep引数なんてそもそもこの関数の引数として用意してないんだから使うなよといえばそれまでだが))。

paste0関数はその良い例とも言える。