2020年
12月
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2020-12-22 Rで式量計算

_ ライブラリを使わずに

Rでデータ処理をしていたのだが、化学式の式量を計算する必要がある。以前はstringrというライブラリを使って計算するプログラムを書いたが、ライブラリのインストールが面倒だということで、ライブラリを使わずに式量を計算するプログラムを書いてみた。

fw<-function(fml){
 aw<-read.table("formula.dat",row.names=1)
 en<-gregexpr("([A-Z][a-z]?)([0-9.]*)",fml,perl=TRUE)[[1]]
 cs<-attr(en,"capture.start")
 cl<-attr(en,"capture.length")
 sum(apply( matrix(substring(fml,cs,cs+cl-1),,2),1,
   function(x) aw[x[1],]*ifelse(x[2]=="",1,as.numeric(x[2])) ))
}

以前書いたものとあまり変わらないが、attrを使ってキャプチャした文字列の場所を変数に入れて、substringで文字列を取り出している。substrを使うと、fmlを複数指定しないといけないので、一括で文字列を取り出す時には、substringの方が便利である。あとは、元素と数を行列の形にして、applyで掛け算をして、sumで足し合わせている。もう少し短く書けそうな気はするけど。