RとwebGL
やり方が変わった
約一年ぶりにRからwebGLを作ろうとしたら,以前のやり方ではうまく行かなかった.以前はwriteWebGLというコマンドを使っていたのだが,ファイルはできるものの,ブラウザーで見るとjavascriptが有効で無いというようなコメントが出る.調べてみたらhtmlwidgets::saveWidgetというコマンドを使うべきだという記述を見つけた.結局,下のコマンドを実行すると,htmlと,必要なjsなどが出力された.
htmlwidgets::saveWidget(rglwidget(), "out.html", selfcontained=FALSE, libdir="lib")
一年でやり方が変わるのは,困ったものだ.
Rとjuliaとrubyとpython
行列の取り扱い方 4つの言語の比較の第八弾として,そのきっかけとなった行列の使い方について表にまとめてみた.
Rjuliarubypython3 初期化 using LinearAlgebra require "numo/linalg" import numpy as np 定義 aa=[1 2; 3 4] a=Numo::NArray[[1,2],[3,4]] a=np.array([[1,2],[3,4]]) 単位行列 bb=I(2) b=Numo::DFloat.eye(2) b=np.eye(2)
b=np.identity(2) 対角行列 dd=diagm([1,2]) d=Numo::NArray[1,2].diag d=np.diag([1,2]) 対角要素 diag(a) diag(a) a.diagonal np.diag(a)
np.diagonal(a)
a.diagonal() 型 dim(a) size(a) a.shape a.shape 要素 a[1,2] a[1,2] a[0,1] a[0,1] 行 a[1,] a[1,:] a[0,true] a[0,:] 列 a[,1] a[:,1] a[true,0] a[:,0] 転置 t(a) transpose(a) a.transpose a.T
a.transpose() 随伴行列 Conj(t(a)) a'
adjoint(a) a.transpose.conj a.T.conjugate() 跡 sum(diag(a)) tr(a) a.
Rとjuliaとrubyとpython
特殊関数 4つの言語の比較の第八弾として特殊関数などの使い方についてまとめてみた.まず,比較的一般的な特殊関数は,以下の表のように使うことができる.
Rjuliarubypython3 導入 julia
using Pkg
Pkg.add("SpecialFunctions") aptitude install ruby-gsl aptitude install python3-scipy 初期化 using SpecialFunctions require "gsl" from scipy import special ガンマ関数 gamma(3) gamma(3) Math.gamma(3) special.gamma(3) ダイガンマ関数 digamma(3) digamma(3) GSL::Sf::psi(3) special.psi(3) ベッセル関数 besselJ(0.1,1) besselj(1,0.1) GSL::Sf::bessel_Jn(1,0.1) special.jv(1,0.1) 次に,多項式で表される特殊関数は,例えば以下のように使うことができる. Rjuliarubypython3 導入 aptitude install r-cran-polynom
R
install.packages("orthopolynom") julia
using Pkg
Pkg.add("SpecialPolynomials") aptitude install ruby-gsl aptitude install python3-scipy 初期化 library(polynom);library(orthopolynom) using SpecialPolynomials require "
Rとjuliaとrubyとpython
ファイル
4つの言語の比較の第七弾として,ファイルの取り扱い方についてまとめてみた.まさか七弾まで来るとは,始めた当初は予想しなかった.基本的な使い方を比較して行く内に,これについてもまとめないとと,増えて行った.さて,肝心の表はこんな感じです.
| R | julia | ruby | python3
|
読み込み
| 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が少しだけくせが強くて難しいかな.
Rとjuliaとrubyとpython
辞書 4つの言語の比較の第六弾として,辞書とかハッシュなどと呼ばれるデータの取り扱いについて,表にまとめてみた.perlを学んだときに,私は始めて知ったものだが,なかなか便利なものだと感じた.perlやrubyではハッシュと,pythonやjuliaではdictionaryつまり辞書と呼ばれる.Rにはこのようなデータ構造は無いが,いくつかの方法で似たような取り扱いができるので,その一つのやり方として,名前付きのベクトルを使った方法を示した.
Rjuliarubypython3 定義 hh=Dict("a"=1,"b"=2) h={"a"=1,"b"=2} h={"a":1,"b":2} 内包表記 dd=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)} テキスト xx=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"]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.
Rとjuliaとrubyとpython
配列 4つの言語の比較の第五弾として,配列の取り扱いについて,表にまとめてみた.言語によって,ベクトルとかリストとか呼び方が違う場合もあります.集合の取り扱いも含まれています.
Rjuliarubypython3 定義 aa=[1,2,4,8,4] a=[1,2,4,8,4] a=[1,2,4,8,4] 連続 bb=Vector(1:10) b=[*1..10] b=list(range(1,11)) 等差数列 bb=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.
Rとjuliaとrubyとpython
関数 4つの言語の比較の第四弾として,関数の取り扱いについて,表にまとめてみた.rubyの場合はメソッドだけど.
Rjuliarubypython3 定義 ff(x)=2x def f(x) 2*x end def f(x):return 2*x 省略値 ff(x=1)=2x
f() def f(x=1) 2*x end
f def f(x=1):return 2*x
f() キーワード引数 ff(;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) 可変長引数 ff(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) 引数展開 ff(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}.
Rとjuliaとrubyとpython
フロー制御 4つの言語の比較の第三弾として,プログラムのフロー制御について,表にまとめてみた.
Rjuliarubypython3 if aa=3
if a==1 print(1)
elseif a==2 print(2)
else print(3)
end a=3
if a==1 then p 1
elsif a==2 then p 2
else p 3
end a=3
if a==1:print(1)
elif a==2:print(2)
else:print(3) 三項演算子 a0,"+","-")) a=2
print(a0 ? "+" : "-") a=2
print(a0?"+":"-") a=2
print('+' if a0 else '-') switch ii="a"
p case i
when "a" then 1
when "b" then 2
end for for(i in 1:10){cat(i);cat("
Rとjuliaとrubyとpython
文字列の取り扱い 前回,4つの言語の比較したが,数値関係の使いやすさはjulia, R, ruby, pythonの順のように感じられた.今回は第二弾で,文字列の扱い方について書きたいと思う.表にまとめると,以下のようになった.
Rjuliarubypython3 繰返 paste(rep("abc",3),collapse="") "abc"^3 "abc"*3 "abc"*3 連結 paste("abc","def",sep="") "abc"*"def" "abc"+"def" "abc"+"def" 結合 paste(1:5,collapse=", ") join(1:5,", ") [*1..5]*", " ", ".join(map(str,range(1,6))) 取出 substr("πℯ^2",2,2) collect("πℯ^2")[2] "πℯ^2"[1] "πℯ^2"[1] 部分 substr("πℯ^2",2,3) String(collect("πℯ^2")[2:3]) "πℯ^2"[1..2]
"πℯ^2"[1,2] "πℯ^2"[1:3] 文字数 nchar("πℯ^2") length("πℯ^2") "πℯ^2".length
"πℯ^2".size len("πℯ^2") 大文字 toupper("This") uppercase("This") "This".upcase "This".upper() 小文字 tolower("This") lowercase("This") "This".downcase "This".lower() 入れ替え chartr("A-Za-z","a-zA-Z","This") "This".swapcase "This".swapcase() 埋込 s="world"
Rとjuliaとrubyとpython
数値の取り扱い
juliaを少しいじり始めたのだが,複数の言語の文法を混同して分からなくなってしまうので,並べて比較してみることにした.まずは,数値や数学関係の取り扱い方を,4つの言語について表にしてみた.
| R | julia | ruby | python3
|
余 | 5%%2 | 5.0%2.0 | 5.0%2.0 | 5.0%2.0
|
商 | 5%/%2 | 5.0÷2.0 | 5/2 or 5.0.div(2.0) | 5.0//2.0
|
分数 | | 5//2 | 5r/2 | from fractions import Fraction;Fraction(5,2)
|
xor | bitwXor(3, 5) | 3⊻5 | 3^5 | 3^5
|
累乗 | 2^0.5 | 2^0.5 | 2**0.5 | 2**0.5
|
平方根 | sqrt(2) | √2 | Math.sqrt(2) | import math;math.sqrt(2)
|
複素数 | (1+2i)^0.5 | (1+2im)^0.5 | (1+2i)**0.5 | (1+2j)**0.5
|
複素数 | sqrt(1+2i) | √(1+2im) | Math.sqrt(1+2i) | import numpy;numpy.sqrt(1+2j)
|
実部
| Re(1+2i)
| real(1+2im)
| (1+2i).real
| (1+2j).real
|
虚部
| Im(1+2i)
| imag(1+2im)
| (1+2i).imag
| (1+2j).imag
|
共役
| Conj(1+2i)
| conj(1+2im)
| (1+2i).conj
| (1+2j).conjugate()
|
偏角
| Arg(1+2i)
| angle(1+2im)
| (1+2i).arg
| import cmath;cmath.phase(1+2j)
|
絶対値 | abs(-1) | abs(-1) | -1.abs | abs(-1)
|
円周率 | pi | π | Math::PI | import math;math.pi
|
Euler数 | exp(1) | ℯ | Math::E | import math;math.e
|
それぞれ,書き方に特徴がある.同じ記号でも,言語によって意味が違う場合があるので,注意が必要である.また,rubyではMathを使わないといけない場合があり,pythonはmathやnumpyなどを使わないといけない場合があり,どの場合にそれらを使わないといけないかを覚えるのが面倒に感じた.Rやjuliaは必要なものは,標準で大体は揃っているように感じるが,juliaではunicode文字を使えるのが特徴的である.eとℯが違うというのも少し驚いた.pythonの複素共役は関数なので括弧が必要というのが奇妙に感じた.