金魚亭日常

読書,ガジェット,競技プログラミング

HTML のプレゼンをPDFに変換する

xaringan の wiki には,スライドをPDFに変換する方法として,

  1. R の webshot package
  2. Chrome でPDFに印刷
  3. node の decktape モジュール

の3つが挙げられている.

Export Slides to PDF · yihui/xaringan Wiki · GitHub

今回はdecktape を使ってみることにした

github.com

インストール

環境

  • Windows 10 Pro
  • node v8.11.3
  • npm 5.6.0
npm -g install decktape 

普通に,npm でインストールするが,node-pre-gyp のエラーが出た.

github.com

github.com

多分,node-gyp というやつがNative binary をビルドするやつで,それをパッケージ作るときに組み込みやすくするやつが node-pre-gyp で,要はC++コンパイラとかが無いからエラーになっているっぽい.

Windows の場合は,

が必要らしい.

Visual C++ build tool はインストール済み. Python は 3.6 を入れていたので,2.7 を公式のインストーラでインストール.

インストールしたら,

 npm config set python C:\python27\python.exe
 npm config set msvs_version 2015

という感じで,設定して,もう一度 npm -g install decktapeでインストール完了.

ちなみに,Visual C++ build toolとPython2.7のインストーラを取ってきてインストールしてくれる windows-build-tools というやつが npm にあるらしいが,今回は使わなかった.

使い方は,

decktape remark https://slides.yihui.name/xaringan xaringan.pdf

という感じ.

R presentation について調べた

この,痒い所に手が届くggplot2作図の技

https://github.com/uribo/talk_180530_ggplot2_tips

のプレゼンがいい感じだったので,R presentation について調べた.

テンプレートは,

github.com

で,テーマは

github.com

らしい.

remark.js を使っている.

使い方は,Ninja Template を読み解けば大体わかる.

なお,xaringan は 写輪眼(ナルト) らしい.


HTML のプレゼンで毎回気になるのは,オフラインで動かすときはどうするのか,というところ.

  • remark.js 自体はダウンロードすればよい(それ用の関数がある,相対パスで指定)
  • mathjax もダウンロードしてくればよい
    • RStudio に同梱されているやつが使える(file:/// で指定)
    • ローカルサーバ立てて使う場合(Infinite Moon Reader アドイン)は,スライドと同じフォルダにコピーしてくればよい(相対パスで指定)

libs/ にダウンロードしてきて,

xaringan::summon_remark(version = "latest", to = "libs/")

YAML front matter に設定を書く

 output: 
        xaringan::moon_reader:
            chakra: "libs/remark-latest.min.js"
        mathjax: "file:///c:/Program Files/RStudio/resources/mathjax-26/MathJax.js?config=TeX-AMS-MML_HTMLorMML"
       # or 
        # mathjax: "libs/mathjax-26/MathJax.js?config=TeX-AMS-MML_HTMLorMML"

フォントは,ローカルにインストールしてあるやつを指定すればよい. google font のweb font を使う場合は,CSS とフォントをダウンロードしてくれば使えるはず.

mono_light(
   base_color = "#1c5253",
   # header: family は 源ノ角ゴシック,weight は bold
   header_font_family = "Source Han Sans JP",
   header_font_weight = "Bold", 
   # 本文: family は 源ノ角ゴシック,weight は Regular
   text_font_family = "Source Han Sans JP",
   # コードは Ricty regular
   code_font_family = "Ricty",
   link_color = "#A1C5AB"
 )

OneNote のページ数の上限は?

はてブしたらOneNote に新しいページを作って保存,という IFTTT レシピを使っていて,ある日エラーで動かなくなった.

チャンネルを再接続しても治らなかったので,もしやページ数の上限か,と思い別のセクションを指定したらなおった.

ページ数の上限はざっと調べたところ不明.

もはやブラウザ版では開けないぐらい重い.

端末3台なので,Evernote が有料になってしまい,OneNote に移行したが,使用頻度はめっきりへってしまった, Evernote から移行したときから,ページ数が多すぎることが原因と思われる同期エラーが出まくってうんざりしたのと, ノートがわかれているのがやはり使いづらく,新しくメモをとることはもはやない.

最近のメモは Scrapbox にとっている.

R で data.frame をグループ分けして fit して プロットする

suppressPackageStartupMessages(library(dplyr))
library(purrr)
library(ggplot2)
library(RColorBrewer)
species <- iris$Species %>% 
            unique() %>% 
            as.character()
fits <- species %>% 
          set_names() %>% 
          map(function(x){
            df <- iris %>% 
              filter(Species == x)
            fit <- lm(Sepal.Length ~ Sepal.Width, data=df)
            fit
          })

fits
#> $setosa
#> 
#> Call:
#> lm(formula = Sepal.Length ~ Sepal.Width, data = df)
#> 
#> Coefficients:
#> (Intercept)  Sepal.Width  
#>      2.6390       0.6905  
#> 
#> 
#> $versicolor
#> 
#> Call:
#> lm(formula = Sepal.Length ~ Sepal.Width, data = df)
#> 
#> Coefficients:
#> (Intercept)  Sepal.Width  
#>      3.5397       0.8651  
#> 
#> 
#> $virginica
#> 
#> Call:
#> lm(formula = Sepal.Length ~ Sepal.Width, data = df)
#> 
#> Coefficients:
#> (Intercept)  Sepal.Width  
#>      3.9068       0.9015

my_palette <- setNames(brewer.pal(3, "Set1"), species)
iris %>% 
  ggplot(aes(x=Sepal.Width, y=Sepal.Length, group=Species, colour=Species)) +
    geom_point() + 
    scale_color_manual(values = my_palette) +
    stat_function(data=data.frame(x=c(1, 5)), 
                  mapping=aes(x, colour=species[1]), 
                  fun=function(x, fit){
                    predict(fit, newdata=data.frame(Sepal.Width=x)
                  )}, 
                  args=list(fit=fits$setosa), 
                  geom="line", 
                  inherit.aes = FALSE) + 
    stat_function(data=data.frame(x=c(1, 5)), 
                  mapping=aes(x, colour=species[2]), 
                  fun=function(x, fit){
                    predict(fit, newdata=data.frame(Sepal.Width=x)
                  )}, 
                  args=list(fit=fits$versicolor), 
                  geom="line", 
                  inherit.aes = FALSE) + 
    stat_function(data=data.frame(x=c(1, 5)), 
                  mapping=aes(x, colour=species[3]), 
                  fun=function(x, fit){
                    predict(fit, newdata=data.frame(Sepal.Width=x)
                  )}, 
                  args=list(fit=fits$virginica), 
                  geom="line", inherit.aes = FALSE)   

dplyr::if_else で NA に置換

data.frame の各列のデータ型は同じでないといけない.

NAlogical なので,dplyr::mutatedouble の列の一部を NA で置換しようとするとエラーになる.

library(dplyr, warn.conflicts = FALSE)                       
data.frame(name=c("a", "b", "c"), value=c(1.2, 3.4, 5.6)) %>%
mutate(value=if_else(name=="b", NA, value))                  
#> Error in mutate_impl(.data, dots): Evaluation error: `false` must be type logical, not double.

なので NA_real_ とかを使う.

library(dplyr, warn.conflicts = FALSE)                       
data.frame(name=c("a", "b", "c"), value=c(1.2, 3.4, 5.6)) %>%
mutate(value=if_else(name=="b", NA_real_, value))            
#>   name value
#> 1    a   1.2
#> 2    b    NA
#> 3    c   5.6