2022年
4月
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

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|

2022-04-04 Rとjuliaとrubyとpython

_ 関数

4つの言語の比較の第四弾として,関数の取り扱いについて,表にまとめてみた.rubyの場合はメソッドだけど.
Rjuliarubypython3
定義 f<-function(x){2*x} f(x)=2x def f(x) 2*x end def f(x):return 2*x
省略値 f<-function(x=1){2*x}
f()
f(x=1)=2x
f()
def f(x=1) 2*x end
f
def f(x=1):return 2*x
f()
キーワード引数 f<-function(x,y){x^y}
f(y=1,x=2)
f(;x,y)=x^y
f(y=1,x=2)
def f(x:,y:) x**y end
f(y:1,x:2)
def f(x,y):return x**y
f(y=1,x=2)
可変長引数 f<-function(x,...){x+length(c(...))}
f(3,2,1)
f(x,a...)=x+length(a)
f(3,2,1)
def f(x,*a) x+a.size end
f(3,2,1)
def f(x,*a):return x+len(a)
f(3,2,1)
引数展開 f<-function(x,y){x+y}
a<-list(1,2)
do.call(f,a)
f(x,y)=x+y
a=[1,2]
f(a...)
def f(x,y) x+y end
a=[1,2]
f(*a)
def f(x,y):return x+y
a=[1,2]
f(*a)
無名関数 (function(x){2*x})(2) (x->2x)(2) proc{|x|2*x}.(2) (lambda x:2*x)(2)
配列 f<-function(x){2*x}
f(1:10)
f(x)=2x
f.(1:10)
def f(x) 2*x end
[*1..10].map{|x|f(x)}
def f(x):return 2*x
list(map(f,range(1,11)))
合成 f<-function(x){2*x}
g<-function(x){x+1}
g(f(2))
f(x)=2x
g(x)=x+1
(g∘f)(2)
2|>f|>g
f=proc{|x|2*x}
g=proc{|x|x+1}
(g<<f).(2)
(f>>g).(2)
import toolz
def f(x):return 2*x
def g(x):return x+1
toolz.compose(g,f)(2)
toolz.pipe(2,f, g,)
juliaは数学の関数のような感じなので,一見は素人にも分かりやすいかも知れない.Rは、引数の展開が難しい。rubyは、methodとprocedureの使い分けが面倒。pythonは、returnが必要なのが面倒なのと,そのままでは関数の合成ができない。順位付をするならが,juliaがトップで,rubyとpythonは同じぐらいで,Rが少し劣るかな.このシリーズはもう少しだけは続けるかな.

2022-04-11 Rとjuliaとrubyとpython

_ 配列

4つの言語の比較の第五弾として,配列の取り扱いについて,表にまとめてみた.言語によって,ベクトルとかリストとか呼び方が違う場合もあります.集合の取り扱いも含まれています.
Rjuliarubypython3
定義 a<-c(1,2,4,8,4) a=[1,2,4,8,4] a=[1,2,4,8,4] a=[1,2,4,8,4]
連続 b<-1:10 b=Vector(1:10) b=[*1..10] b=list(range(1,11))
等差数列 b<-seq(1,20,2) b=Vector(1:2:20) b=[*(1..20).step(2)] b=list(range(1,21,2))
内包表記 [i^2 for i in 1:5] [i**2 for i in range(1,6)]
map sapply(1:10,function(x){2*x}) map(x->2x,1:10) [*1..10].map{|x|2*x} list(map(lambda x:2*x,range(1,11)))
最初 a[1]
head(a,1)
a[1]
a[begin]
first(a)
a[0]
a.first
a[0]
要素 a[2] a[2] a[1] a[1]
最後 tail(a,1) a[end]
last(a)
a[-1]
a.last
a[-1]
最後から tail(a,2)[1] a[end-1] a[-2] a[-2]
範囲 a[1:3] a[1:3] a[0..2]
a[0,3]
a[0:3]
追加 a<-append(a,3)
a<-c(a,3)
push!(a,3) a.push(3)
a<<3
a.append(3)
取出 a<-head(a,-1) pop!(a) a.pop a.pop()
挿入 a<-append(a,9,2) insert!(a,3,9) a.insert(2,9) a.insert(2,9)
削除 a<-a[-3] deleteat!(a,3) a.delete_at(2) a.pop(2)
長さ length(a) length(a) a.length
a.size
len(a)
逆順 rev(a) reverse(a) a.reverse list(reversed(a))
上書き逆順 a<-rev(a) reverse!(a) a.reverse! a.reverse()
重複除去 unique(a) unique(a) a.uniq set(a)
ソート sort(a) sort(a) a.sort sorted(a)
上書きソート a<-sort(a) sort!(a) a.sort! a.sort()
結合 c(a,b) vcat(a,b) a+b a+b
含有 2%in%a 2∈a
a∋2
a.include?(2) 2 in a
部分集合 all(a%in%b) a⊆b
b⊇a
require 'set'
Set[*a]<=Set[*b]
Set[*b]>=Set[*a]
Set[*a].subset?(Set[*b])
Set[*b].supset?(Set[*a])
set(a)<=set(b)
set(b)>=set(a)
set(a).issubset(b)
set(b).issuperset(a)
積集合 intersect(a,b) a∩b a&b set(a)&set(b)
和集合 union(a,b) a∪b a|b set(a)|set(b)
差集合 setdiff(a,b) setdiff(a,b) a-b set(a)-set(b)
対称差集合 symdiff(a,b) require 'set'
Set[*a]^Set[*b]
set(a)^set(b)
最大 max(a) maximum(a) a.max max(a)
最小 min(a) minimum(a) a.min min(a)
総和 sum(a) sum(a) a.sum sum(a)
Rとjuliaはindexが1から始まることに気をつけないといけない.Rとrubyには内包表記は無い。pythonはlistをつけないといけない場合がある.どれが使いやすいかは甲乙つけがたし,というかこちらを立てればあちらが立たずという感じかな.Rも慣れると使いやすい気がする.

2022-04-19 Rとjuliaとrubyとpython

_ 辞書

4つの言語の比較の第六弾として,辞書とかハッシュなどと呼ばれるデータの取り扱いについて,表にまとめてみた.perlを学んだときに,私は始めて知ったものだが,なかなか便利なものだと感じた.perlやrubyではハッシュと,pythonやjuliaではdictionaryつまり辞書と呼ばれる.Rにはこのようなデータ構造は無いが,いくつかの方法で似たような取り扱いができるので,その一つのやり方として,名前付きのベクトルを使った方法を示した.
Rjuliarubypython3
定義 h<-c("a"=1,"b"=2) h=Dict("a"=>1,"b"=>2) h={"a"=>1,"b"=>2} h={"a":1,"b":2}
内包表記 d<-sapply(as.character(1:5),function(x)as.numeric(x)^2) d=Dict((string(k),k^2) for k=1:5) d=(1..5).to_h{|i|[i.to_s,i**2]} d={str(k):k**2 for k in range(1,6)}
テキスト x<-scan(text="H 1\nHe 4", what=list("",1))
names(x[[2]])<-x[[1]]
x<-x[[2]]
x=Dict(split(i) for i in split("H 1\nHe 4","\n")) x=Hash[*"H 1\nHe 4".split] x=dict(i.split() for i in "H 1\nHe 4".split("\n"))
アクセス h["a"] h["a"] h["a"] h["a"]
追加 h["c"]<-3 h["c"]=3 h["c"]=3 h["c"]=3
キー names(h) keys(h) h.keys h.keys()
h values(h) h.values h.values()
キーの存在 "a"%in%names(h) haskey(h,"a") h.key?("a") "a" in h
値の存在 1%in%h 1∈values(h) h.value?(1) 1 in h.values()
長さ length(h) length(h) h.length
h.size
len(h)
結合 d<-c(x,h) d=merge(h,x) d=h.merge(x) d={**h,**x}
上書き結合 h<-c(x,h) merge!(h,x) h.merge!(x) h.update(x)
Rでは,data.frameを使っても同じようなことができる.
x<-read.table(text="H 1\nHe 4",row.names=1)
x["H",]
とすると,一列目を名前として取り込むことができ,これを用いて値を取り出すことができるが,上で示した方法では必要なかったカンマをつける必要がある.使いやすさとしては,テキストから辞書への変換はrubyが楽で, pythonでは結合が少しやりにくいので,ruby, julia, python, Rの順かな.ネタが尽きてきたので,シリーズになっていた今回の言語比較ももうそろそろ終わりになりそうです.perlを加えて比較すべきだったかも知れませんが,perlの文法はかなり忘れてしまったし,perlを書く機会もあまり無いだろうから,まあ良いかな.

2022-04-25 Rとjuliaとrubyとpython

_ ファイル

4つの言語の比較の第七弾として,ファイルの取り扱い方についてまとめてみた.まさか七弾まで来るとは,始めた当初は予想しなかった.基本的な使い方を比較して行く内に,これについてもまとめないとと,増えて行った.さて,肝心の表はこんな感じです.
Rjuliarubypython3
読み込み f<-file("index.html","r")
d<-readLines(f)
close(f)
f=open("index.html","r")
d=readlines(f)
close(f)
f=open("index.html","r")
d=f.readlines
f.close
f=open("index.html","r")
d=f.readlines()
f.close()
ブロック d=open("index.html","r") do f readlines(f) end d=open("index.html","r"){|f|f.readlines} with open("index.html","r") as f: d=f.readlines()
ファイル名 d<-readLines("index.html") d=readlines("index.html")
全体読み込み d<-readChar("index.html",file.info("index.html")$size,TRUE) d=open(f->read(f,String),"index.html") d=open("index.html","r"){|f|f.read} with open("index.html","r") as f: d=f.read()
書き込み cat("Hello, world!",file="out.txt") open(f->print(f,"Hello, world!"),"out.txt","w") open("out.txt","w"){|f|f.print "Hello, world!"} with open("out.txt","w") as f: f.write("Hello, world!")
追加 cat("Hello, world!",file="out.txt",append=TRUE) open(f->print(f,"Hello, world!"),"out.txt","a") open("out.txt","a"){|f|f.print "Hello, world!"} with open("out.txt","a") as f: f.write("Hello, world!")
それぞれの言語で少し異なっているが,一番上の標準的は方法はほとんど同じだが,openとcloseが面倒である. Rでは,ファイル名を指定する方法が楽かな. juliaは,読み込みはファイル名を指定して,書き込みはopenで関数を指定するのが良い気がする. rubyとpythonはブロックを使うと良い. 使いやすさにはあまり違いは無いが,Rが少しだけくせが強くて難しいかな.