【正規表現】任意一文字マッチのピリオドをエスケープ

f:id:kyle1985:20160909223016p:plain
The R logo is © 2016 The R Foundation.
https://www.r-project.org/logo/Rlogo.svg
CC-BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/



Rの文字列操作系のコマンドのはなし."."(ピリオド)を,正規表現の任意一文字としてではなく,ピリオドそのものとしてマッチさせたい.

> sub(".", "fuga", "hoge.hoge")

[1] "fugaoge.hoge"

最初の"f"に,任意一文字としてマッチングしてしまう.
エスケープするには"\"(バックスラッシュ)が必要とのこと.ふむふむ.

> sub("\.", "fuga", "hoge.hoge")

 エラー:  ""\." で始まる文字列の中で '\.' は文字列で認識されないエスケープです 

怒られる.なぜか.いろいろやってみたところ,バックスラッシュを2回入れることで解決.

> sub("\\.", "fuga", "hoge.hoge")

[1] "hogefugahoge"

そうそう,これがやりたかった.

Rのロゴは使っていいのか

前回の記事でRのロゴを使いたかったのだが,使っていいのかどうか(著作権的に)わからなかったので泣く泣く諦めた.

mammoth.hatenadiary.com

果たしてRのロゴをブログに使ってよかったのか.どうでもよいが,最近Rのロゴはフラットデザインになった.かっこいい.


Rのロゴについて公式にこんなことが書かれていた.

The CC-BY-SA 4.0 license allows you to share and adapt the logo for any purpose, including commercial use, provided that you give appropriate credit, provide a link to the license, and indicate if any changes were made.
https://www.r-project.org/logo/(強調は筆者)

ふむふむ.きちんと約束を守れば商用利用も含めて自由に使っていいらしいぞ.では約束事とはなんだろうか.

クレジットを明記

クレジットという言葉はよく聞くけれど,実際にどう使えばよいのか自信がない...というわけで上の引用中に書いてあるCC-BY-SA 4.0とやらを見てみよう.

If supplied, you must provide the name of the creator and attribution parties, a copyright notice, a license notice, a disclaimer notice, and a link to the material.
Creative Commons — Attribution-ShareAlike 4.0 International — CC BY-SA 4.0(強調は筆者)

なるほど.つまり

  • 作成者や配布している団体
  • コピーライト
  • ライセンス
  • 免責事項
  • (今回使いたい)素材へのリンク

を,それらが配布元で明らかにされている場合に限り明記すればいいらしい.

作成者・配布元とコピーライト,素材へのリンクの明記はいいだろう.ライセンスは次に触れる.免責事項についてはよくわからん.とりあえずロゴについての公式ページ上部に書かれているThe R logo is © 2016 The R Foundation.というのをそのまま貼り付けておけばいいのだろう,たぶん.

ライセンスへのリンクを明記

CC-BY-SA 4.0のリンクを貼ればいいんじゃね?

加工した場合,その旨を明記

オリジナルの素材に変更を加えた場合,その旨を明記しなければならないそうだ.

結論

満を持して使わせていただこう.

f:id:kyle1985:20160909223016p:plain
The R logo is © 2016 The R Foundation.
https://www.r-project.org/logo/Rlogo.svg
CC-BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/

かっこいい.

【R】変数名を動的に生成【assign(), paste(), get()】

Rで変数を動的に生成したい.
たとえば,hoge1, hoge2, hoge3, ...といった感じに.

paste()

まずは変数名の作り方.

> paste("hoge", "fuga", sep="")

[1] "hogefuga"

引数sepは区切りを表す.たとえば,

> paste("hoge", "fuga", "hoge", sep="_")

[1] "hoge_fuga_hoge"

assign()

作成した文字列を変数名として初期化する.

> for(i in 1:10){
+   paste("hoge", i, sep="") <- i
+ }

 paste("hoge", i, sep = "") <- i でエラー: 
   付値対象は非言語オブジェクトに展開されます 

といった感じで怒られるので,assign(変数名(str), 値)を使おう.

> for(i in 1:10){
+   assign(paste("hoge", i, sep=""), i)
+ }

> hoge2
[1] 2

しっかり入っている.


get()

動的に生成した変数の値を確認したい.

> for(i in 1:10){
+   print(paste("hoge", i, sep=""))
+ }

[1] "hoge1"
[1] "hoge2"
[1] "hoge3"
[1] "hoge4"
[1] "hoge5"
[1] "hoge6"
[1] "hoge7"
[1] "hoge8"
[1] "hoge9"
[1] "hoge10"

変数に格納されている値ではなく,変数名を文字列型として返してきた.こういうときはget()を使う.

> for(i in 1:10){
+   print(
+     get(paste("hoge", i, sep=""))
+     )
+ }

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

今回のノート

for(i in 1:10){
  assign(paste("hoge", i, sep=""), i)
}
### generate variables dynamically


for(i in 1:10){
  print(
    get(paste("hoge", i, sep=""))
    )
}
### get the value of variables NOT str data