金魚亭日常

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

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

R で NFD 濁点ファイル名読み込み

Mac つかってるっぽい人から「データ.csv」みたいなやつをもらって,Rで読もうとしたときファイルが無いと言われ,dir()してみると濁点が分解されちゃっていた場合.

結論

基本的なファイル操作は可能なので,file.copy() でコピー・リネームしてから扱うのがよい

見分け方

コマンドプロンプトdir すると見分けがつく. エクスプローラ上で見分けるには,ファイル名をBackSpace で消してみて,濁点だけ消せるかどうかを確認する.

入力方法

\U3099 を入力したい場合は,powershell[char]0x3099 とか打ってコピペする方法などがある ( http://d.hatena.ne.jp/miau/20110805/1312555736

メモ

  • ファイル操作は可能
 file.create("テ\U3099ータ.csv")
 file.copy("テ\U3099ータ.csv", "data.csv")
  • file.path()で結合は不可.paste() だと可
    • \U3099\U309B になっている気がする
    • 逆に,テ\U3099 をコピペしてRStudio で保存すると, になるっぽい
 a <- "dir"
 b <- "テ\U3099ータ.csv"
 
 file.exist(file.path(a, b)) # => FALSE
 file.exist(paste(a, b, sep="/")) # => TRUE
  • read.csv()write.csv() は可能
 write.csv("テ\U3099ータ.csv")
 read.csv("テ\U3099ータ.csv")

jupyter notebook の カスタム Exporter を作る

jupyter の公式ドキュメント の例のように,post save hook で nbconvert --to=scriptnbconvert --to=html が走るようにしている.

で,スクリプトのファイルは,Python の場合は Markdown のセルがコメントとして保存されるが,R (IRKernel) の場合だと,Markdown のセルは保存されない. 考えてみれば当たり前のことで,各言語によってコメントの書式は異なるからだ.

nbconvert --to=script での処理順序

nbconvert --to=script したときにどういう処理が行われるかというと,

  1. notebook の metadata の language_info を見る
  2. language_infonbconvert_exporter を見て,これに該当するExporter があるかどうかを確認する
    • entrypoints の nbconvert.exporters から探す
    • あったらそれを使う(Pythonの場合はこちら)
    • 最初 nbconvert_exporterの値で探して,そのあと to_lower() した値で探す
  3. nbconvert.exporters が無い場合は name を見る
    • entrypoints の nbconvert.exporters.script から探す
    • あったらそれを使う
    • to_lower() せず,そのままの値で探すのみ
  4. 汎用の Exporter を使う
    • R の場合はこちら

という感じになる

カスタム Exporter の作成

nbconvert の公式ドキュメント にカスタムExporter の書き方が載っているので,基本的にこれの通りにやる

entrypoints というのは,インストールされているパッケージを全部見て,setup.py に Exporter があれば登録する,ということをしているらしい.

なので,カスタム Exporter をPythonのパッケージとして作る

まず,こういう感じのディレクトリを作る

nbconvert_exporter_r
|   setup.py
+---nbconvert_exporter_r
|   |   __init__.py
|   \---templates
|           r.tpl

次に,ファイルの中身を書く.

setup.py

from setuptools import setup, find_packages

setup(
    name='nbconvert_exporter_r',
    version='0.0.3',
    description='Custom exporter of nbconvert for R language',
    author='whatalnk',
    packages=find_packages(),
    package_data={
        '': ['templates/*.tpl'],
    },
    entry_points={
        'nbconvert.exporters.script': [
            'R = nbconvert_exporter_r:RExporter'
        ],
    }
)

重要なのは,

  • package に template が含まれるように,package_data を書く
  • entry_points の キーはnbconvert.exporters.script にする
    • IRKernel の metadata には nbconvert_exporters がない

というところ.

__init__.py

import os
import os.path

from traitlets.config import Config
from nbconvert.exporters.templateexporter import TemplateExporter

class RExporter(TemplateExporter):
    export_from_notebook = "R format"

    def _file_extension_default(self):
        return '.R'

    @property
    def template_path(self):
        return super().template_path + [os.path.join(os.path.dirname(__file__), "templates")]

    def _template_file_default(self):
        return 'r.tpl' 

基本的に python の exporter と同じ.

r.tpl

{%- extends 'script.tpl' -%}

{% block in_prompt %}
{% if resources.global_content_filter.include_input_prompt -%}
    # In[{{ cell.execution_count if cell.execution_count else ' ' }}]:
{% endif %}
{% endblock in_prompt %}

{% block input %}
{{ cell.source }}
{% endblock input %}

{% block markdowncell scoped %}
{{ cell.source | comment_lines }}
{% endblock markdowncell %}

こちらも,基本的に python の template と同じ

パッケージング

# pip install wheel
python setup.py bdist_wheel

インストール

pip install --force-reinstall dist\nbconvert_exporter_r-0.0.3-py3-none-any.whl

できたやつ

github.com

2018年5月に読んだ本

  • 昨日何食べた?

レシピが流れてきて,おいしかったので,買った. なかなか参考になる.

  • 集中力はいらない

普段から80%の力で仕事して,かつ締め切りには余裕で間に合うようにする

  • ψの悲劇

前回の内容若干忘れていて,最初現代の話だと思ってしまった.

期間 : 2018年05月
読了数 : 15 冊
きのう何食べた?(12) (モーニング KC)
よしなが ふみ / 講談社 (2016-10-21)
読了日:2018年5月28日
きのう何食べた? 通常版(11)    (モーニング KC)
よしなが ふみ / 講談社 (2015-11-20)
読了日:2018年5月28日
きのう何食べた?(10) (モーニング KC)
よしなが ふみ / 講談社 (2015-06-23)
読了日:2018年5月28日
きのう何食べた?(9) (モーニング KC)
よしなが ふみ / 講談社 (2014-08-22)
読了日:2018年5月28日
きのう何食べた?(7) (モーニング KC)
よしなが ふみ / 講談社 (2012-12-03)
読了日:2018年5月28日
きのう何食べた?(8) (モーニング KC)
よしなが ふみ / 講談社 (2013-12-03)
読了日:2018年5月28日
きのう何食べた?(1) (モーニング KC)
よしなが ふみ / 講談社 (2007-11-22)
読了日:2018年5月26日
きのう何食べた?(5) (モーニング KC)
よしなが ふみ / 講談社 (2011-09-23)
読了日:2018年5月26日
きのう何食べた?(4) (モーニング KC)
よしなが ふみ / 講談社 (2010-10-22)
読了日:2018年5月26日
きのう何食べた?(2) (モーニング KC)
よしなが ふみ / 講談社 (2008-11-21)
読了日:2018年5月26日
きのう何食べた?(6) (モーニング KC)
よしなが ふみ / 講談社 (2012-05-23)
読了日:2018年5月26日
きのう何食べた? 3 (モーニング KC)
よしなが ふみ / 講談社 (2009-10-23)
読了日:2018年5月26日
集中力はいらない (SB新書)
森 博嗣 / SBクリエイティブ (2018-03-06)
読了日:2018年5月16日
ψの悲劇 The Tragedy of ψ (講談社ノベルス)
森 博嗣 / 講談社 (2018-05-09)
読了日:2018年5月10日
アルスラーン戦記(9) (講談社コミックス)
荒川 弘 / 講談社 (2018-05-09)
読了日:2018年5月9日

ggplot2 book をビルドする

環境: Windows 10, TexLive 2018, MSYS64

なんか最後latexmk のmaxrepeat に達したから終了する,みたいなエラー出てたけどPDFはできた. 索引までできているので,一応ビルドできたっぽい

結構パッケージ入るので,ライブラリ切ったほうが良かったかも

レポジトリ をクローンしてきてRStudio でプロジェクトを開き, 依存パッケージをインストール

library(devtools)
if (packageVersion("devtools") < "1.9.1") {
  message("Please upgrade devtools")
}
devtools::install_deps()

make は msys64 のやつを使う(一時的にPATHを通す).

Rstudio から Build all

oldbookdown がないというエラーが出るので,インストール

devtools::install_github("hadley/oldbookdown")
# yaml パッケージのインストールに失敗したのでリトライした

wesanderson::wes_palettes() の名前が変更されているのを修正(scales.rmd を編集する)

# GrandBudapest : chr [1:4] "#F1BB7B" "#FD6467" "#5B1A18" "#D67236"
# は
# GrandBudapest1 = c("#F1BB7B", "#FD6467", "#5B1A18", "#D67236"),

# Zissou : chr [1:5] "#3B9AB2" "#78B7C5" "#EBCC2A" "#E1AF00" ...
# は
# Zissou1 = c("#3B9AB2", "#78B7C5", "#EBCC2A", "#E1AF00", "#F21A00"),

# Rushmore : chr [1:5] "#E1BD6D" "#EABE94" "#0B775E" "#35274A" ...
# は
# Rushmore = c("#E1BD6D", "#EABE94", "#0B775E", "#35274A" ,"#F2300F"),

USAboundariesData のインストールに失敗したというエラーが出たので,インストール

install.packages("USAboundariesData", repos = "http://packages.ropensci.org", type = "source")

toolbox.rmd でエラー.

データフレームの構造が最新版では変わっているらしいので,古いバージョンを入れる

github.com

# Quitting from lines 684-692 (toolbox.rmd) 
# Error in FUN(X[[i]], ...) : object 'group' not found
devtools::install_version(package = "USAboundaries", version = "0.2.0")

ディレクトリが作られてなかったので作った

# cp -R _figures/* book/tex/_figures
# cp: target 'book/tex/_figures' is not a directory
# cp -R diagrams/* book/tex/diagrams
# cp: target 'book/tex/diagrams' is not a directory

find がおかしい

=> C:\Windows\System32\find.exe が上にきていた(Makefile
=> Makefile を修正(フルパスで指定)

C:/msys64/usr/bin/find $(TEXDIR) -type f -name "*.png" -exec optipng -strip all -o0 -clobber -quiet {} \;

optipng がない

=> インストールしてパスを通す

pacman -S mingw-w64-x86_64-optipng